$
(Если в строке, следующей за командой
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 <file
$ 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
| "Документ здесь": стандартный выходной поток задается в последующих строках до строки, состоящей из одного символа 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
|