Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2024

Указания и подсказки к практикуму 4

Автоматическое дополнение команд

В bash встроена возможность автоматически дополнять аргументы при вводе команд. Для этого используется клавиша Tab.

Bash умеет дополнять:

Если вы нажимаете Tab при вводе аргумента 0 (первого в команде), то bash пытается дополнить название программы. Почти во всех остальных случаях происходит дополнение имени файла или папки. При дополнении путей происходит достраивание только части имени до следующего символа / включительно.

Дополнение происходит в двух случаях.

  1. Есть ровно один вариант дополнения (который подходит под ту часть аргумента, которую вы уже ввели в командную строку).
  2. Все подходящие варианты содержат одинаковые символы после тех, которые уже введены. В этом случае достраиваются только эти общие символы.

Если дополнения не произошло, то у вас есть около секунды, чтобы вывести полный список возможных дополнений. Для этого нужно успеть нажать Tab второй раз. Список возможных дополнение выводится только для справки, из него нельзя выбрать (даже не пытайтесь нажимать стрелочки или кликать мышкой). Достаточно продолжить ввод аргумента таким образом, чтобы остался единственный подходящий вариант дополнения. После чего можно его автоматически достоить с помощью Tab.

Обязательно научитесь применять автоматическую подстановку! Она очень упрощает ввод практически всех команд.

История введенных команд

Bash хранит историю введенных во время ссессии команд. Команды из завершенных сессий тоже сохраняются в истории, если сессии были правильным образом завершены (вводом команды exit или сочетанием клавиш Ctrl+D).

Вы можете подставлять команды из истории с помощью стрелочек ↑ и ↓. Например, если опечатались при вводе команды, но не заметили и выполнили её (получив сообщение об ошибке), то можно нажать ↑, исправить подставленную команду, а потом выполнить уже правильный вариант.

В bash есть значительно более хитрые способы подстановки команд или их частей из истории с помощью специальных символов. Можете попробовать изучить их самостоятельно.

Специальные символы

Здесь можно подсмотреть, как правильно выполнять упражнения по мнению преподавателей (по крайней мере некоторых :-) ). Даже если справились со всем самостоятельно, не помешает сверить ваши решения с предложенными.

#1
$ mkdir ~/term1/pr4
$ cd ~/term1/pr4
#2
$ mkdir a
$ cp /P/y23/term1/Tab-and-Arrows_are_your_friends/*a* a
#3
$ echo a/*a*a*
a/alanine a/asparagine a/aspartate a/glutamate a/phenylalanine
 -- есть 5 файлов, содержащих более одной a в коротком имени
#4
$ echo a/*nine
a/alanine a/arginine a/phenylalanine
$ rm a/*nine
#5
$ mkdir you
$ cp /P/y24/term1/Tab-and-Arrows_are_your_friends/*[you]* you
#6
$ echo /P/y24/term1/Tab-and-Arrows_are_your_friends/[r-z]*
/P/y24/term1/Tab-and-Arrows_are_your_friends/selenocysteine /P/y24/term1/Tab-and-Arrows_are_your_friends/serine /P/y24/term1/Tab-and-Arrows_are_your_friends/threonine /P/y24/term1/Tab-and-Arrows_are_your_friends/tryptophan /P/y24/term1/Tab-and-Arrows_are_your_friends/tyrosine /P/y24/term1/Tab-and-Arrows_are_your_friends/valine
 -- так сложно считать
$ ls -1 /P/y24/term1/Tab-and-Arrows_are_your_friends/[r-z]*
/P/y24/term1/Tab-and-Arrows_are_your_friends/selenocysteine
/P/y24/term1/Tab-and-Arrows_are_your_friends/serine
/P/y24/term1/Tab-and-Arrows_are_your_friends/threonine
/P/y24/term1/Tab-and-Arrows_are_your_friends/tryptophan
/P/y24/term1/Tab-and-Arrows_are_your_friends/tyrosine
/P/y24/term1/Tab-and-Arrows_are_your_friends/valine
 -- так проще, 6 файлов (это опция -один а не -л)
$ basename -a /P/y24/term1/Tab-and-Arrows_are_your_friends/[r-z]*
selenocysteine
serine
threonine
tryptophan
tyrosine
valine
 -- а так еще и понятнее, полезно знать всякие программы
#7
$ echo you/*a?a*
you/glutamate you/phenylalanine
 -- есть два файла c одним символом между двумя a в имени
$ echo you/*a??a*
you/*a??a*
 -- а с двумя нет, маска остается без изменения, если нет подходящих файлов
#8
$ ls -1 /P/y24/term1/name_your_file_in_english_and_without_spaces/?
/P/y24/term1/name_your_file_in_english_and_without_spaces/B
/P/y24/term1/name_your_file_in_english_and_without_spaces/K
/P/y24/term1/name_your_file_in_english_and_without_spaces/L
 -- три файла
$ ls -1 /P/y24/term1/name_your_file_in_english_and_without_spaces/??
ls: cannot access '/P/y24/term1/name_your_file_in_english_and_without_spaces/??': No such file or directory
 -- нет файлов
$ ls -1 /P/y24/term1/name_your_file_in_english_and_without_spaces/???
/P/y24/term1/name_your_file_in_english_and_without_spaces/AJT
/P/y24/term1/name_your_file_in_english_and_without_spaces/AXT
 -- два файла
#9
$ ls -1 /P/y24/term1/name_your_file_in_english_and_without_spaces/*[0-9]
/P/y24/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep0
/P/y24/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep3
/P/y24/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep4
/P/y24/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep5
 -- четыре файла
$ ls -1 /P/y24/term1/name_your_file_in_english_and_without_spaces/*[0-9][0-9]
ls: cannot access '/P/y24/term1/name_your_file_in_english_and_without_spaces/*[0-9][0-9]': No such file or directory
#10
$ cp you/glycine 'you/???cine'
$ cp you/glycine 'you/gl*e'
#11
$ mkdir strange
$ mv 'you/???cine' strange
$ mv 'you/gl*e' strange
 -- не забываем экранировать специальные символы!
$ echo strange/*
strange/???cine strange/gl*e
#12
$ cp strange/gl\*e strange/gl\'ycin\'e
$ mv strange/gl\*e strange/gl\'\*\'e
$ echo strange/*
strange/???cine strange/gl'*'e strange/gl'ycin'e
#13
$ cp /P/y24/term1/Tab-and-Arrows_are_your_friends/gl* /P/y24/term1/Tab-and-Arrows_are_your_friends/asp* strange
 -- где можно указать одну маску (которая потенциально заменится на произвольное число аргументов)
 -- можно указать сколько угодно масок, так ведь?
#14
$ rm */g*e
#15
$ rm */*
$ rmdir *
#16
$ echo cp a{1,2,3}m
cp a1m a2m a3m
 -- четыре аргумента
$ echo cp {a..f}
cp a b c d e f
 -- в отличие от масок, подстановка фигурных скобок не проверяет наличия файлов
$ echo cp {a..f}{1,2,3}
cp a1 a2 a3 b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3
 -- если в аргументе несколько фигурных скобок, то выдаются все варианты раскрытий
 -- на самом деле, можно даже вложенные фигурные скобки использовать
#17
$ cd
$ echo *
Desktop Downloads public_html term1
 -- а где все скрытые?
$ echo * .*
Desktop Downloads public_html term1 . .. .bash_history .bash_logout .bashrc .cache .config .dmrc .gnupg .ICEauthority .lesshst .local .mozilla .nv .pki .profile .ssh .viminfo .Xauthority .xsession-errors .xsession-errors.old
 -- одной маской обойтись не получится
 -- в файловых масках точку в начале короткого имени надо указывать явно
 -- (чтобы обычные маски не цепляли скрытые файлы)
$ echo .??*
.bash_history .bash_logout .bashrc .cache .config .dmrc .gnupg .ICEauthority .lesshst .local .mozilla .nv .pki .profile .ssh .viminfo .Xauthority .xsession-errors .xsession-errors.old
 -- явная точка в начале, потом два любых символа, а дальше что угодно

Редактирование в терминале

В nano используются следующие обозначения: ^ значит Ctrl, M- значит Meta (но такой клавиши обычно нет, вместо нее работает Alt или Esc), Sh- значит Shift, Bsc – Backspace и т.д. Заглавные буквы всегда означают просто нажатие на соответствующую клавишу без Shift. Если требуется Shift, то это указано явно.

В меню сохранения файла есть два "переключателя" формата переносов строк: M-D (Alt+d) для формата DOS, т.е. двумя байтами CRLF; M-M (Alt+m) для устаревшего формата Mac, т.е. одним байтом CR. Переключатель (toggle) означает, что первое нажатие изменяет формат на требуемый, а последующее возвращает на формат по-умолчанию. Формат по умолчанию – Unix, т.е. одним символом LF. Если при сохранении будет использован формат, отличный от Unix, то это указывается в квадратных скобках перед окошком ввода имени файла.

Программа file для текстовых файлов перечисляет все встреченные в нем варианты переносов строк, если только в файле не использован формат Unix. В этом случае про концы строк не указывается ничего.

$ file file1.txt
file1.txt: UTF-8 Unicode text
 -- нормальный текстовый файл в кодировке utf-8
$ file file2.txt
file2.txt: ASCII text
 -- нормальный текстовый файл в кодировке ascii
$ file file3.txt
file3.txt: ASCII test, with CRLF, CR, LF line terminators
 -- а бывает и такое, если кто-то надругался над файлом
 -- в нем встречаются все 3 типа переносов

Удаленное копирование

Если у вас есть доступ к какому-то компьютеру по SSH, то, как правило, доступны еще протоколы удаленного копирования файлов SFTP и SCP. Для работы с этими протоколами в Windows 10 и всех современных Unix-подобных системах существуют встроенные консольные клиенты sftp и scp.

sftp – это интерактивная программа. После её запуска вы окажетесь в сеансе связи по SFTP. Вам будут доступны команды для перемещения одновременно на удаленной и локальной машинах (cd и lcd), для определения текущей папки (pwd и lpwd) и получения списка файлов (ls и lls). И главное, в вашем распоряжении команды put и get. Первая позволяет скопировать файл из текущей папки на локальном компьютере в текущую папку на удаленном, а вторая – в обратном направлении. Для выхода из сеанса SFTP предусмотрена команда exit (или quit, или bye, это синонимы). А команда help выводит список доступных команд с кратким описанием.

scp работает по аналогии с cp (т.е. неинтерактивно), но понимает дополнительный вид имен файлов – имена на удаленных машинах. Пример: user@host.na.me:file1 – путь к файлу file1, который лежит в домашней папке пользователя user на удаленной машине с доменным именем domain.na.me. В качестве имени файла можно указывать любой путь относительно домашней папки пользователя, или абсолютный путь к файлу (тогда сразу после : будет /). Совет: не пытайтесь скопировать файл с одной удаленной машины на другую удаленную машину (т.е. использовать расширенный синтаксис имени файла сразу и в качестве SOURCE, и в качестве DEST). В теории это возможно, но только при подключении по SSH в режиме без паролей, а вы так не умеете.

Советую попробовать обе программы и выбрать подход, который вам ближе. Самое важное при использовании sftp и scp – определиться, на каком из компьютеров их запускать! Помните, что вам нужна возможность подключения к удаленному компьютеру по SSH. Поэтому вы не сможете скопировать файл на kodomo со своего домашнего компьютера, запустив программу на kodomo. У вашего компьютера, скорее всего, нет доменного имени (или публичного IP), и на вашем компьютере не запущен SSH-сервер, необходимый для подключения. Поэтому для копирования файла с домашнего компьютера на kodomo запускать sftp/scp нужно на домашнем компьютере, а не на kodomo.

В программах sftp и scp для указания порта используется опция -P (а не -p, как у ssh). Это можно узнать, просмотрев соответствующие справочные страницы в системе man.

#1
test24@linclass:...$ cd
 -- cd без аргументов переходит в домашнюю папку пользователя
test24@linclass:~$ pwd
/home/students/y24/test24
#2
test24@linclass:~$ sftp -P 22221 test24@kodomo.fbb.msu.ru
test24@kodomo.fbb.msu.ru's password:
Connected to kodomo.fbb.msu.ru.
sftp> pwd
Remote working directory: /home/students/y24/test24
sftp> lpwd
Local working directory: /home/students/y24/test24
#3
sftp> put /etc/hostname /tmp/pr4/test24
Uploading /etc/hostname to /tmp/pr4/test24
hostname                                      100%    8     7.7KB/s   00:00    
#4
sftp> ls /tmp/pr4/
/tmp/pr4/hostname   /tmp/pr4/test24
sftp> exit
#5
test24@linclass:~$ ssh -p 22221 test24@kodomo.fbb.msu.ru
test24@kodomo.fbb.msu.ru's password: 
Linux kodomo 6.1.0-23-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64
You have no mail.
Last login: Sat Sep 21 15:32:38 2024 from 95.24.161.234
Disk quotas for user test24 (uid 12400): 
  FILESYSTEM   SPACE   QUOTA   LIMIT   GRACE   FILES   QUOTA   LIMIT   GRACE
home          30788K    500M    700M             209    100k    200k        
mail              0K    500M    550M               1       0       0
test24@kodomo:~$ less /tmp/pr4/test24

2024/1/hints4 (последним исправлял пользователь is_rusinov 2024-09-27 07:09:37)