Команды и операторы Bash

Завершено

В каждом языке оболочки имеются свои наиболее используемые команды. Давайте начнем создание вашей системы команд Bash с изучения самых распространенных команд.

Команды Bash

Рассмотрим распространенные команды Bash и способы их использования.

Команда ls

Команда ls выводит содержимое текущего каталога или каталога, указанного в аргументе. Эта команда без аргументов выдает список всех файлов и подкаталогов текущего каталога:

ls

Файлы и каталоги, имена которых начинаются с точки, по умолчанию скрыты. Чтобы включить их в список каталога, используйте флаг -a:

ls -a

Чтобы получить больше сведений о файлах и подкаталогах в текущем каталоге, используйте флаг -l:

ls -l

Ниже приведен пример выходных данных из каталога, содержащего несколько JPEG-файлов и PNG-файлов, а также подкаталог с именем gifs.

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

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

Команда cat

Предположим, вам нужно увидеть, что находится внутри файла. Для этого можно использовать команду cat. Результаты этой команды вряд ли будут иметь особый смысл, если это не текстовый файл. Следующая команда отображает содержимое файла os-release, который находится в каталоге /etc:

cat /etc/os-release

Это полезная команда, так как в ее результатах указывается, какой дистрибутив Linux вы используете:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Каталог /etc — это особый каталог в Linux. В нем содержатся файлы конфигурации системы. Не следует удалять файлы из этого каталога, если вы не знаете точно, что делаете.

Команда sudo

Некоторые команды Bash может выполнять только привилегированный пользователь — системный администратор или суперпользователь. При попытке выполнить одну из этих команд без достаточных привилегий произойдет сбой. Например, только пользователи, вошедшие в качестве суперпользователя, могут использовать команду cat для вывода содержимого файла /etc/at.deny:

cat /etc/at.deny

at.deny — это специальный файл, который определяет, кто может использовать другие команды Bash, чтобы отправлять задания для последующего выполнения.

Не следует работать от имени привилегированного пользователя большую часть времени, так как это слишком опасно. Чтобы выполнить команду, для которой требуются права администратора, без входа в качестве суперпользователя, укажите sudo перед этой командой:

sudo cat /etc/at.deny

sudo расшифровывается как "superuser do" (выполнить от имени суперпользователя). Используя sudo, вы сообщаете оболочке, что для этой одной команды действуете с правами привилегированного пользователя.

Команды cd, mkdir и rmdir

Команда cd означает "change directory" (изменить каталог). Ее действие полностью соответствует имени: она изменяет текущий каталог на другой. С ее помощью вы можете перемещаться из одного каталога в другой, как с помощью ее аналога в Windows. Следующая команда перемещает из текущего каталога в его подкаталог с именем orders:

cd orders

Чтобы перейти в каталог уровнем выше, укажите .. в качестве имени каталога:

cd ..

Эта команда выполняет перемещение в домашний каталог — тот, где вы оказываетесь при изначальном входе в систему:

cd ~

С помощью команды mkdir можно создавать каталоги. Следующая команда создает подкаталог с именем orders в текущем рабочем каталоге:

mkdir orders

Если вы хотите одной командой создать подкаталог и в нем еще один подкаталог, используйте флаг --parents:

mkdir --parents orders/2019

Команда rmdir удаляет (удаляет) каталог, но только если он пуст. Если это не пусто, вы получите предупреждение. К счастью, можно использовать rm команду для удаления каталогов, которые не пусты в сочетании с флагом -r (рекурсивным). Затем команда будет выглядеть следующим образом rm -r.

Команда rm

Команда rm — сокращение от "remove" (удалить). И, как следует из названия, rm удаляет файлы. Так, следующая команда ликвидирует файл 0001.jpg:

rm 0001.jpg

А эта команда удаляет все файлы текущего каталога:

rm *

При использовании rm будьте внимательны. Это опасная команда.

Выполняя команду rm с флагом -i, вы сможете подумать перед удалением:

rm -i *

Привыкните включать флаг -i в каждую команду rm, и вы можете избежать одну из самых серьезных ошибок в Linux. Эта опасная команда rm -rf / удаляет каждый файл на всем диске. Она работает, рекурсивно удаляя все подкаталоги корневого каталога и их подкаталоги. Добавление флага -f (от "force" — принудительно) усугубляет проблему, подавляя запросы. Не делайте так.

Если требуется удалить непустой каталог с именем orders, можно использовать команду rm следующим образом:

rm -r orders

Будет удален подкаталог orders со всем его содержимым, включая другие подкаталоги.

Команда cp

С помощью команды cp вы можете копировать не только файлы, но при желании и полные каталоги (с подкаталогами). Чтобы сделать копию файла 0001.jpg с именем 0002.jpg, выполните следующую команду:

cp 0001.jpg 0002.jpg

Если файл 0002.jpg уже существует, Bash без предупреждения заменит его. Все замечательно, если именно это и требовалось, но совсем не так прекрасно, если вы не осознавали, что будет перезаписана старая версия.

К счастью, вы можете использовать флаг -i (от "interactive" — интерактивно), и Bash будет предупреждать вас перед удалением существующих файлов. Это гораздо безопаснее:

cp -i 0001.jpg 0002.jpg

Конечно, вы можете использовать подстановочные знаки, чтобы копировать несколько файлов одновременно. Чтобы скопировать все файлы из текущего каталога в подкаталог с именем photos, выполните следующую команду:

cp * photos

Чтобы скопировать все файлы из подкаталога с именем photos в подкаталог с именем images, выполните следующую команду:

cp photos/* images

В данном случае предполагается, что каталог images уже существует. Если он еще не существует, его можно создать и скопировать содержимое каталога photos с помощью следующей команды:

cp -r photos images

-r расшифровывается как "recursive" (рекурсивно) Дополнительное преимущество использования флага -r заключается в том, что если каталог photos содержит подкаталоги, они все тоже будут скопированы в каталог images.

Команда ps

С помощью команды ps можно получить моментальный снимок всех процессов, выполняющихся в текущий момент. Выданная без аргументов, эта команда отображает все процессы оболочки, то есть немного. Совсем другое дело, если использовать флаг -e:

ps -e

С помощью флага -e отображаются все выполняющиеся процессы, и обычно их много.

Чтобы получить более полное представление о том, какие процессы выполняются в системе, используйте флаг -ef:

ps -ef 

С помощью этого флага отображаются имена всех выполняющихся процессов, идентификаторы этих процессов (PID), идентификаторы (PID) их родителей (PPID) и время их запуска (STIME). Также показывается, к какому терминалу (TTY) они подключены, если таковой имеется, сколько времени ЦП они потребили (TIME) и их полные пути. Вот сокращенный пример:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Кроме того, вы можете найти в документации, что ps используется таким образом:

ps aux

ps aux и ps -ef идентичны. Эта двойственность восходит к историческим различиям между системами POSIX Unix (одной из которых является Linux) и системами BSD Unix (наиболее распространенной из которых является macOS). В самом начале в POSIX использовался флаг -ef, а в BSD требовался флаг aux. В настоящее время оба семейства операционных систем принимают любой из этих форматов.

Это служит отличным примером, почему следует внимательно изучать все команды Linux в руководстве. Изучение Bash похоже на изучение английского в качестве второго языка. В правилах существует много исключений.

Команда w

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

Чтобы узнать, кто присутствует на ваших серверах, в Linux предусмотрена команда w (от "who" — "кто"). Она отображает информацию о пользователях, которые в текущий момент присутствуют в компьютерной системе, и действиях этих пользователей. Команда w показывает имена пользователей, их IP-адреса, время, когда они вошли в систему, процессы, которые они выполняют в текущий момент, и сколько времени эти процессы потребляют. Это ценный инструмент для системных администраторов.

Операторы ввода-вывода Bash

В Linux можно выполнять самые разные действия, просто используя команды Bash и их многочисленные параметры. Но вы сможете сделать буквально все, объединяя команды с помощью операторов ввода-вывода:

  • <, чтобы использовать для ввода данных источник, отличный от клавиатуры;
  • >, чтобы направлять вывод данных в пункт назначения, отличный от экрана;
  • >>, чтобы сделать то же самое, но с добавлением данных вместо перезаписи;
  • |, чтобы путем конвейерной передачи направить выходные данные одной команды во входные данные для другой команды.

Предположим, что требуется получить список всего содержимого текущего каталога, но записать выходной результат в файл с именем listing.txt. Это можно сделать с помощью следующей команды:

ls > listing.txt

Если файл listing.txt уже существует, он будет перезаписан. Если же вместо этого оператора использовать оператор >>, то выходной результат команды ls будет добавлен к содержимому файла listing.txt:

ls >> listing.txt

Оператор конвейерной передачи имеет огромные возможности (и часто используется). Он перенаправляет вывод первой команды во ввод второй команды. Предположим, что вы используете cat для отображения содержимого большого файла, но это содержимое прокручивается слишком быстро для чтения. Можно сделать вывод более управляемым путем передачи результатов в другую команду, такую как more. Следующая команда выводит список всех текущих выполняющихся процессов. Но после заполнения экрана вывод данных будет приостановлен, пока вы не нажмете ВВОД, чтобы отобразить следующую строку:

ps -ef | more

Вы также можете передать выходные данные в команду head, чтобы увидеть только первые несколько строк:

ps -ef | head

Или, например, вам нужно отфильтровать выходные данные, чтобы включить только те строки, в которых имеется слово "daemon". Один из способов сделать это — передать выходные данные из ps в очень удобный инструмент Linux grep:

ps -ef | grep daemon

Результат будет выглядеть следующим образом:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

Кроме того, в качестве источника ввода можно использовать файлы. По умолчанию стандартный ввод осуществляется с клавиатуры, но его тоже можно перенаправить. Чтобы задать ввод входных данных из файла, а не с клавиатуры, используйте оператор <. Системные администраторы часто сталкиваются с такой задачей, как сортировка содержимого файла. Как видно из названия, команда sort сортирует текст в алфавитном порядке:

sort < file.txt

Чтобы сохранить отсортированные результаты в новый файл, можно перенаправить ввод и вывод:

sort < file.txt > sorted_file.txt

Операторы ввода-вывода можно использовать для объединения команд Linux в цепочку в соответствии с необходимостью. Рассмотрим следующую команду:

cat file.txt | fmt | pr | lpr

Выходные данные команды cat передаются в команду fmt, выходные данные fmt передаются в pr и так далее. Команда fmt форматирует результаты в виде аккуратных абзацев. Команда pr разбивает результаты по страницам. И, наконец, команда lpr отправляет разбитые по страницам выходные данные на принтер. И все в одной строке!