Книга: Основы программирования в Linux
Каналы
Каналы
Вы можете соединять процессы с помощью оператора канала (|
). В ОС Linux, в отличие от MS-DOS, процессы, соединенные каналами, могут выполняться одновременно и автоматически переупорядочиваться в соответствии с потоками данных между ними. Как пример, можно применить команду sort
для сортировки вывода команды ps.
Если не применять каналы, придется использовать несколько шагов, подобных следующим:
$ 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, прежде чем прочтете его.