Если не применять каналы, придется использовать несколько шагов, подобных следующим:
$ ps > psout.txt
$ sort psout.txt > pssort.out
Соединение процессов каналом даст более элегантное решение:
$ ps | sort > pssort.out
Поскольку вы, вероятно, захотите увидеть на экране вывод, разделенный на страницы, можно подсоединить третий процесс, more
, и все это в одной командной строке:
$ ps | sort | more
Практически нет ограничений на допустимое количество процессов. Предположим, что вы хотите видеть все имена выполняющихся процессов, за исключением командных оболочек. Можно применить следующую командную строку:
$ ps -хо соmm | sort | uniq | grep -v sh | more
В ней берется вывод команды ps
, сортируется в алфавитном порядке, из него извлекаются процессы с помощью команды uniq
, применяется утилита grep -v sh
для удаления процесса с именем sh
и в завершение полученный список постранично выводится на экран.
Как видите, это гораздо более элегантное решение, чем строка из отдельных команд, каждая со своими временными файлами. Но в этом случае имейте в виду следующее. Если строка состоит из команд, файл вывода создается или записывается сразу, как только сформирован набор команд, поэтому в строке из нескольких команд никогда не используйте дважды одно и то же имя файла. Если вы попытаетесь сделать что-то подобное:
cat mydata.txt | sort | uniq > mydata.txt
то в результате получите пустой файл, т.к. вы перезапишете файл mydata.txt, прежде чем прочтете его.
Командная оболочка как язык программирования
Теперь, когда вы увидели некоторые базовые операции командной оболочки, самое время перейти к реальным программам оболочки. Есть два способа написания таких программ. Вы можете ввести последовательность команд и разрешить командной оболочке выполнить их в интерактивном режиме или сохранить эти команды в файле и затем запускать его как программу.
Интерактивные программы
Легкий и очень полезный во время обучения или тестирования способ проверить работу небольших фрагментов кода — просто набрать с клавиатуры в командной строке сценарий командной оболочки.
Предположим, что у вас большое количество файлов на языке С, и вы хотите проверить наличие в них строки POSIX
. Вместо того чтобы искать в файлах строку с помощью команды grep
и затем выводить на экран отдельно каждый файл, вы можете выполнить всю операцию в интерактивном сценарии, похожем на следующий:
$ for file in *
> do
> if grep -l POSIX $file
> then
> more $file
> fi
> done
posix
This is a file with POSIX in it - treat it well
$
Обратите внимание на то, как меняется знак $
, стандартная подсказка или приглашение командной оболочки, на символ >
, когда оболочка ожидает очередной ввод. Вы можете продолжить набор, дав оболочке понять, когда закончите, и сценарий немедленно выполнится.
В этом примере команда grep
выводит на экран найденные ею имена файлов, содержащих строку POSIX
, а затем команда more
отображает на экране содержимое файла. В конце на экран возвращается приглашение командной оболочки. Обратите внимание также на то, что вы ввели переменную командной оболочки, которая обрабатывает каждый файл для самодокументирования сценария. С таким же успехом вы могли бы использовать переменную i
, но имя file
более информативно с точки зрения пользователей.
Командная оболочка также обрабатывает групповые символы или метасимволы (часто называемые знаками подстановки). Вы почти наверняка знаете о применении символа *
как знака подстановки, соответствующего строке символов. Но вы можете не знать о существовании односимвольного знака подстановки, ?
, а конструкция [set]
позволяет проверить любое количество одиночных символов, [^set]
— применяет логическую операцию "НЕ" к множеству, т.е. включает все, кроме того, что вы задали. Подстановочный шаблон из фигурных скобок {}
(доступен в некоторых командных оболочках, включая bash) позволяет формировать множество из произвольных строк, которое командная оболочка раскроет. Например, команда
$ ls my_{finger, toe}s
будет выводить файлы my_fingers и my_toes. Эта команда использует оболочку для проверки всех файлов в текущем каталоге. Мы вернемся к этим правилам соответствия шаблонам в конце главы, когда будем более подробно рассматривать утилиту grep
и возможности регулярных выражений.
Опытные пользователи ОС Linux, вероятно, выполнят эту операцию более эффективным способом, возможно, с помощью следующей команды:
$ more `grep -l POSIX *`
или синонимической конструкции
$ more $(grep -l POSIX *)
В дополнение команда
$ grep -l POSIX * | more
выведет на экран имя файла, содержащего строку POSIX
. В этом сценарии мы видим, что командная оболочка для выполнения трудной работы привлекает другие команды, например, grep
и more
. Оболочка просто позволяет собрать вместе несколько имеющихся команд новыми оригинальными способами. В следующих сценариях вы увидите использование знаков подстановки неоднократно. Мы подробно рассмотрим целую область подстановок, когда будем знакомиться с регулярными выражениями в разделе, посвященном команде grep
.