Как уже отмечалось, описание интерпретатора разделено на две части. В этой главе от простейших возможностей, показанных в гл. 1, мы перейдем к рассмотрению некоторых необычных, но широко используемых конструкций, таких, как метасимволы, кавычки, новые команды с переданными им аргументами, переменные shell
shell и даже предоставлять их другим пользователям. Такое деление темы, конечно, во многом произвольно, поэтому мы рекомендуем вам прочитать обе главы.3.1 Структура командной строки
Прежде чем продолжить рассмотрение, нужно уточнить, что такое команда и как она интерпретируется shell
Самая простая команда состоит из одного слова, обычно имени файла, предназначенного для выполнения (позднее вы познакомитесь с другими типами команд):
$ who
you tty2 Sep 28 07:51
jpl tty4 Sep 28 08:32
$
Команда, как правило, завершается символом перевода строки, но может завершаться и точкой с запятой:
$ date;
Wed Sep 28 09:07:15 EDT 1983
$ date; who
Wed Sep 28 09:07:23 EDT 1983
you tty2 Sep 28 07:51
jpl tty4 Sep 28 08:32
$
Однако выполнение команды не начнется, пока вы не нажмете клавишу
$ date; who
идентичен вводу двух команд в разных строках. В частности, команда who
date. Попробуйте послать результат выполнения этих команд по программному каналу:$ date; who | wc
Wed Sep 28 09: 08:48 EDT 1983
2 10 60
$
Возможно, вы получите не то, что ожидали, поскольку только результат команды who
wc. При связывании who и wc через программный канал образуется единая команда, называемая конвейером, которая выполняется после date. В процессе разбора командной строки shell считает приоритет операции '|' выше, чем операции ';'. Для группирования команд следует использовать скобки:$ (date; who)
Wed Sep 28 09:11:09 EDT 1983
you tty2 Sep 28 07:51
jpl tty4 Sep 28 08:32
$ (date; who) | wc
3 16 89
$
Результат выполнения команд date
who конкатенируется в один поток, который можно передать по программному каналу.Информацию, поступающую по программному каналу, можно с помощью команды tee
tee является частью интерпретатора shell, но тем не менее удобна и при манипулировании программными каналами. Ее можно использовать для сохранения промежуточного результата в файле:$ (date; who) | tee save | wc
3 16 89
$ cat save
Wed Sep 28 09:13:22 EDT 1983
you tty2 Sep 28 07:51
jpl tty4 Sep 28 08:32
$ wc
3 16 48
$
Команда tee
tee не присутствовала в конвейере.В качестве еще одного символа, завершающего команду, применяют амперсанд (&
& используется для запуска фоновых, долго выполняющихся команд, в то время как вы продолжаете вводить новые команды в диалоге:$ long-running-command &
5273
$
Имея возможность группировать команды, получаем некоторые интересные способы применения фоновых процессов. Команда sleep
$ sleep 5
$
$ (sleep 5; date) & date
5278
Wed Sep 28 09:18:20 EDT 1983
$ Wed Sep 28 09:18:25 EDT 1983
через 5 секунд дата