Главный способ работы в терминале — ввод текстовых команд.
Команда может состоять из нескольких блоков:
mkdir
[ключевое слово]
-p
[набор параметров]
/usr/home/documents/work
[набор аргументов]
Блоки параметров (или, иначе, ключей) и аргументов могут включать в себя сразу несколько значений.
Скажем миру привет:
echo "Hello, World!"
Здесь echo
— ключевое слово. "Hello, World!"
— аргумент в виде строки, который передаётся команде. Ключи в примере не используются.
Чтобы запустить команду, после ввода нажмите клавишу Enter.
В терминале можно получить информацию практически о любой доступной в нём команде. Справка выводится с помощью команды:
man [ключевое слово]
Например, man echo
вызовет справку по использованной выше команде echo
. Она будет включать описание, список доступных ключей и тип принимаемых аргументов. Чтобы выйти из режима чтения справки, нажмите клавишу q.
Кроме man
, многие команды поддерживают параметр --help
. При запуске команды с ним в терминал будет выведена краткая сводка по её функциям.
А теперь перейдём к более специфическим возможностям.
Запуск нескольких команд за раз
Командная строка имеет несколько инструментов, которые позволяют запускать сразу несколько операций, управлять порядком их выполнения и выводом.
Например, если нам нужно выполнить несколько команд последовательно, не обязательно вводить каждую по отдельности. Можно перечислить их через точку с запятой:
echo -n "Hello, "; echo "World!"
Если нам нужно выполнить список зависимых друг от друга команд, для их разделения нужно использовать оператор &&
. В таком случае следующая команда в списке будет выполнена только при условии успешного выполнения предыдущей.
echo -n "Hello, " && echo "World!"
Оператор ||
действует наоборот — запускает следующую операцию при условии, что первая не выполнилась или завершилась с ошибкой.
wrongCommand || echo "Что-то пошло не так!"
Также можно запускать команды параллельно. Для этого в конец команд добавляется символ &
, каждая команда заключается в круглые скобки, которые между тем разделяются между собой точкой с запятой:
(echo "Кто сказал, что убить двух зайцев" &); (echo "одним махом нельзя?" &)
Перенаправление ввода/вывода
Вывод команды можно перенаправлять. Это бывает полезно, например, когда нам нужно сохранить результат выполненных действий в файл, или, наоборот, передать аргументы из файла в команду. Для этого используются три оператора: >
, >>
и <
.
Пример записи вывода команды в файл:
echo "Hello, World!" > hello.txt
Вместо вывода строки "Hello, World!"
в терминал она будет записана в файл hello.txt
. Если такого файла не существует, он будет автоматически создан, а если существует, то будет перезаписан (осторожно — всё старое содержимое безвозвратно удалится).
Если нам нужно записать результат выполнения в конец файла, а не перезаписывать его полностью, можно использовать второй оператор, >>
:
echo "Hello, World!" >> hello.txt
А так можно передать в команду аргументы из файла:
tee hello2.txt < hello.txt
tee
прочитает информацию из файла hello.txt
, выведет его содержимое в терминал и одновременно сохранит его в новый файл hello2.txt
У потоков ввода/вывода есть своё специфическое обозначение. Это положительное целое число, определяющее источник ввода/вывода.
0
— стандартный ввод (stdin
)1
— стандартный вывод (stdout
)2
— вывод ошибок (stderr
)
Самый распространённый пример использования — перенаправление ошибок при выполнении команд, в т.ч. в bash
-скриптах. В примере ниже ошибка о том, что команды не существует, будет направлена на устройство /dev/null
. Оно автоматически обнуляет всю записываемую на него информацию:
wrongCommand 2>/dev/null
Если нам нужно записывать ошибки в лог-файл, всё так же просто:
wrongCommand 2>>error.log
В этом случае ошибка о том, что команды wrongCommand
не существует, будет записана в файл error.log
Более подробно о потоках данных читайте в статье Bash-скрипты. Перенаправление ввода и вывода.
Конвейер
Конвейер (pipe) — очень мощный инструмент, позволяющий передавать результаты работы одних команд в виде аргументов другим командам. Для этого используется оператор |
ls | grep "hello"
В примере мы выводим список содержимого текущей рабочей директории (ls
) и передаём его команде grep
. Она в свою очередь ищет в нём файлы, в имени которых содержится "hello"
, и выводит их список на экран.
Подробнее о конвейерах в Linux читайте в статье.
Выполнение в фоновом режиме
Некоторые команды могут временно блокировать или усложнять работу в терминале. Например, когда запущенный процесс долго выполняется или выводит в консоль большие объёмы не особо полезного текста. Такие команды можно запускать в фоновом режиме. Тогда система будет выполнять их «на заднем плане», а вы продолжите работать и не будете ждать выполнения очередной операции.
Чтобы запустить команду в фоновом режиме, достаточно добавить в конце знак «&»
:
sleep 3600 &
sleep
— команда «И пусть весь мир подождёт». Включает паузу на заданный промежуток времени в секундах.
Если вам нужно переместить на задний план активный процесс, тогда нужно прервать процесс его выполнения сочетанием Ctrl + Z и ввести в консоли команду bg
:
sleep 3600
[останавливаем процесс сочетанием Ctrl + Z]
bg
Вывести список команд, запущенных в фоновом режиме, можно с помощью команды
jobs -l
Важно помнить, что фоновый режим привязан к сессии — при выходе из терминала все процессы, запущенные через него, будут прерваны. Этого можно избежать, выполнив нужную команду через nohup
:
nohup sleep 3600 &
Либо, если процесс уже запущен, отвязать его от сессии можно командой disown
с идентификатором ID
нужной задачи.
disown -h %ID
После выхода из терминала задание будет удалено из списка jobs
, но продолжит выполняться на фоне. Проверить его выполнение можно, отобразив список всех запущенных процессов командой ps aux
:
Команды, запущенные в фоновом режиме, при наличии ошибок будут отправлять их в терминал — что не всегда удобно. Можно перенаправить вывод ошибок. В следующем примере ошибки вместо вывода в терминал будут записаны в файл error.log
:
sleep 3600 2>>error.log &
Вернуть процесс на передний план можно, введя команду fg
. Если процессов несколько, потребуется указать идентификатор задачи ID
. Его можно посмотреть в выводе команды jobs -l
(число в квадратных скобках).
fg %ID
Отмена процесса, запущенного в фоновом режиме, выполняется с помощью следующей команды:
kill PID
Где PID
— ID процесса, указанный в выводе jobs -l
. Если процесс завис и не реагирует, можно использовать более грубый вариант:
kill -KILL PID
Теперь самое время познакомиться с базовым набором команд для работы в терминале.