5291
$
(Если в строке, следующей за командой
echo
, есть символ ctl-g, то при появлении ее на экране зазвонит звонок.) В этих примерах нужны скобки, так как приоритет '&'
выше, чем у ';'
.Символ
&
может завершать команды, а поскольку конвейеры являются командами, в скобках для запуска конвейеров как фоновых процессов нет необходимости, поэтому$ pr файл | lpr &
позволяет выдать файл на печатающее устройство, не ожидая окончания выполнения команды. Использование скобок дает тот же эффект, но требует введения большего числа символов:
$ (pr файл | lpr ) &
To же, что и в предыдущем примереБольшинство команд допускает наличие аргументов в командной строке, таких, как файл в предыдущем примере (аргумент команды
pr
). Аргументами служат слова, разделенные пробелами и символами табуляции, которые обычно именуют файлы, предназначенные для обработки командой. Однако они рассматриваются просто как строки, и программа может интерпретировать их любым подходящим для нее способом. Например, команда pr допускает имена файлов, которые нужно напечатать, команда echo
посылает эхо своих аргументов без всякой интерпретации, а первый аргумент команды grep специфицирует строку-шаблон для поиска. И конечно, многие команды имеют необязательные параметры (флаги), задаваемые аргументами, начинающимися со знака “-
”.Различные специальные символы, интерпретируемые
shell
, такие, как <
, >
, |
, ;
и &
, не являются аргументами команд, запускаемых интерпретатором. Они управляют самим процессом запуска. Например,$ echo Hello > junk
требует, чтобы интерпретатор запустил команду
echo
с одним аргументом Hello
и поместил выходной поток в файл junk
. Строка > junk
не является аргументом команды echo
; она интерпретируется shell
, и echo
никогда ее "не увидит". На самом деле, данная строка может и не быть последней в командной строке:$ > junk echo Hello
Это идентичный запуск, хотя и менее очевидный.
Упражнение 3.1В чем состоит различие между следующими командами?
$ cat file | pr
$ pr
$ pr file
(С течением времени операция переключения
<
потеряла свою связь с программными каналами; "cat file |
" считается более естественным, чем "< file
".)3.2 Метасимволы
Интерпретатор распознает еще ряд символов как специальные. Наиболее часто используется звездочка
*
, указывающая, что нужно искать в каталоге имена файлов, у которых вместо *
может быть любая последовательность символов. Например,$ echo *
есть не что иное, как некое подобие команды
ls
. В гл. 1 мы не отметили, что во избежание проблем с именами '.'
и '..'
, которые присутствуют в любом каталоге, символы подстановки в именах файлов нельзя применять к именам файлов, начинающимся с точки. Правило таково: символы подстановки в именах файлов действуют на имена файлов, начинающихся с точки, только в том случае, если точка явно задана в шаблоне. Как обычно, "рассудительная" команда echo
прояснит ситуацию:$ ls
.profile
junk
temp
$ echo *
junk temp
$ echo .*
. .. .profile
$
Символы со специальным значением, подобные
*
, называются метасимволами. Существует множество метасимволов (в табл. 3.1 приводится их полный список, но некоторые символы мы обсудим только в гл. 5).>
prog > file
— переключить стандартный выходной поток в файл>>
prog >> file
— добавить стандартный выходной поток к файлу<
prog < file
— извлечь стандартней выходной поток из файла|
p1 | p2
— передать стандартный выходной поток p1
как стандартный выходной поток для p2
<
"Документ здесь": стандартный выходной поток задается в последующих строках до строки, состоящей из одного символа str
*
Задает любую строку, состоящую из нуля или более символов, в имени файла ?
Задает любой символ в имени файла [ccc]
Задает любой символ из [ccc]
в имени файла (допустимы диапазоны, такие, как 0-9
или a-z
) ;
Завершает команды: p1; p2
— выполнить p1
, затем p2
&
Выполняет аналогичные функции, но не ждет окончания p1
`...`
Инициирует выполнение команд(ы) в ...
; `...`
заменяется своим стандартным выводом (...)
Инициирует выполнение команд(ы) в ...
в порожденном shell
{...}
Инициирует выполнение команд(ы) в ...
в текущем вызове shell (используется редко) $1, $2, ...
Заменяются аргументами командного файла $var
Значение переменной var
в программе на языке shell
${var}
Значение var
; исключает коллизии в случае конкатенации переменной с последующим текстом (см. также табл. 5.3) \
\c
— использовать непосредственно символ c
, \
перевод строки отбрасывается'...'
Означает непосредственное использование "..."
Означает непосредственное использование, но после того, как $
, `...`
и \
будут интерпретированы #
В начале слова означает, что вся остальная строка рассматривается как комментарий (но не в седьмой версии) var=value
Присваивает value
переменной var
p1 && p2
Предписывает выполнить p1
; в случае успеха выполнить p2
p1 || p2
Предписывает выполнить p1
; в случае неудачи выполнить p2
Таблица 3.1: Метасимволы shell
При таком количестве метасимволов интерпретатора необходимо иметь возможность экранировать специальный символ от интерпретации. Самый простой и надежный способ экранирования — заключить его в апострофы:
$ echo '* * *'
* * *
$
Можно также использовать кавычки
"..."
, но интерпретатор на самом деле "заглядывает" внутрь этих кавычек в поиске метасимволов $
, '...'
и \
, так что не применяйте "..."
, если только вам не требуется определенным образом обработать строку в кавычках.Еще одну возможность дает ввод обратной дробной черты перед каждым символом, который вы хотите закрыть от интерпретатора, например: