Имеется несколько символов, которые имеют в Shell специальное значение. Это <, >, *, ?, [ и ]. Чтобы отменить специальное значение этих символов, требуется заключать их особым образом в одинарные (') или двойные (") кавычки. То же действие в отношении одиночного символа выполняет обратная наклонная черта (\). (Обратные одинарные кавычки (`) используются только для командной подстановки в Shell и не отменяют специальных значений символов.)
Все символы, заключенные в одинарные кавычки, воспринимаются как обычные текстовые символы. Например, строка:
echostuff='echo $? $*; ls *| wc'
только присваивает переменной echostuff значение
echo $? $*; ls *| wc
но не вызывает выполнение ни одной из команд.
Внутри двойных кавычек специальное значение сохраняется только у некоторых символов - это $, \, ` и ". В результате внутри двойных кавычек имеет место подстановка значений переменных и команд. Однако, сами по себе двойные кавычки никак не влияют на подставляемые команды, и поэтому такие символы, как *, сохраняют свое специальное значение.
Чтобы отменить специальное значение символа $ и одинарных и двойных кавычек внутри двойных кавычек, перед ними требуется дополнительно указывать символ \. Вне двойных кавычек указание символа \ перед специальным символом адекватно заключению этого специального символа в одинарные кавычки. Символ \, стоящий перед символом новой строки, обозначает игнорирование этого символа.
Благодаря этому можно продлевать командную строку.
Ниже приводятся несколько примеров использования кавычек:
Ввод
Интерпретация
'`'
обратная кавычка
'"'
двойная кавычка
'`echo one`'
одно слово "`echo one`"
"\""
двойная кавычка
"`echo one`"
слово one
"`"
cинтаксическая ошибка
one two
два слова one и two
"one two"
одно слово "one two"
'one two'
одно слово "one two"
'one * two'
одно слово "one * two"
"one * two"
одно слово "one * two"
`echo one`
одно слово "one"
Последовательность команд, разделенных вертикальными чертами (|), образует конвейер. В конвейере, состоящем более чем из одной команды, каждая команда выполняется как отдельный процесс связанный с соседними с помощью программных каналов - т.е. вывод каждой команды (за исключением последней) становится вводом для следующей команды в строке.
Фильтр - это команда, которая считывает стандартный ввод, преобразует его некоторым образом и затем записывает в стандартный вывод. Конвейер, как правило, состоит из последовательности фильтров. Несмотря на то, что процессы в конвейере могут выполняться параллельно, каждой программе необходимо прочитать вывод предыдущей. Многие команды работают с отдельными строками текста - считывают их, обрабатывают, записывают и возвращаются назад для считывания новых строк. Некоторые команды должны наоборот сначала считать большой объем данных и потом только начинают выводить результаты - sort является примером такой команды, которой требуется вначале считать все входные данные и затем только будет проводиться обработка. Вот пример типичного конвейера:
nroff -mm text| col| lpr
Здесь nroff - это форматер текста, имеющийся в Системе Обработки Текстов UNIX, col - преобразует вывод для конкретного типа дисплея и lpr осуществляет печать текста. Флаг -mm обозначает одну из наиболее часто употребляемых опций форматирования, и text - это имя файла, который должен быть отформатирован. Следующие примеры демонстрируют множество возможностей, которые могут быть получены комбинированием команд описанными выше способами. Попробуйте выполнить их :
* who
Печатает на экране список зарегистрированных в системе пользователей.
* who >> log
Добавляет список загруженных пользователей в конец файла log.
* who| wc -l
Печатает количество зарегистрированных пользователей.
* who| pr
Постранично печатает список пользователей.
* who| sort
Печатает список пользователей в алфавитном порядке.
* who| grep bob
Печатает список пользователей, чьи имена содержат слово
bob.
* who| grep bob| sort| pr
Печатает постранично в алфавитном порядке список пользователей, чьи имена содержат слово bob.
* { date;who | wc -l; } >> log
Добавляет в файл log текущую дату и количество зарегистрированных в системе пользователей. Обратите внимание на пробелы после левой фигурной скобки и перед правой фигурной скобкой.
* who| sed -e 's/ .*//'| sort| uniq -d
Печатает имена только тех пользователей, которые регистрировались в системе более одного раза. Обратите внимание на использование sed в качестве фильтра для удаления символов, стоящих после имени пользователей.
Команда who сама по себе не имеет возможности получать все эти результаты - их можно получить только объединив who с другими командами. Команда who в этих примерах служит как источник информации. В качестве упражнения замените "who|" на "</etc/passwd" и убедитесь в том, что файл может также быть использован как источник данных. Помните, что аргументы переадресации могут находиться в любом месте в командной строке, даже в самом ее начале. Это значит, что конвейер