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

Завершено

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

Команды Bash

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

Команда ls

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

ls

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

ls -a

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

ls -l

Ниже приведен пример выходных данных из каталога, который содержит несколько JPEG и PNG и подкаталог с именами GIF:

-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 можно создавать каталоги. Следующая команда создает подкаталог именованных заказов в текущем рабочем каталоге:

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" — принудительно) усугубляет проблему, подавляя запросы. Не делайте этого.

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

rm -r orders

При этом удаляется подкаталог заказов и все в нем, включая другие подкаталогы.

Команда cp

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

cp 0001.jpg 0002.jpg

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

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

cp -i 0001.jpg 0002.jpg

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

cp * photos

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

cp photos/* images

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

cp -r photos images

-r сокращение от слова "рекурсивный". Еще одним преимуществом использования флага -r является то, что если фотографии содержат свои подкаталоги, они также копируются в каталог изображений.

Команда 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 отправляет разбитые по страницам выходные данные на принтер. И все в одной строке!