Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
В предыдущем примере стандартный вывод перенаправлен в файл с помощью оператора
>set -о noclobberset -Сnoclobberset +о noclobbersetДля дозаписи в конец файла используйте оператор
>>$ <b>ps >> lsoutput.txt</b>добавит вывод команды
psДля перенаправления стандартного потока ошибок перед оператором
>2>Предположим, что вы хотите применить команду
killkillkillКоманда
$ <b>kill -HUP 1234 >killout. txt 2>killer.txt</b>поместит вывод и информацию об ошибке в разные файлы.
Если вы предпочитаете собрать оба набора выводимых данных в одном файле, можно применить оператор
>&$ <b>kill -1 1234 >killerr.txt 2>&1</b>поместит свой вывод и стандартный поток ошибок в один и тот же файл. Обратите внимание на порядок следования операторов. Приведенный пример читается как "перенаправить стандартный вывод в файл killerr.txt, а затем перенаправить стандартный поток ошибок туда же, куда и стандартный вывод". Если вы нарушите порядок, перенаправление выполнится не так, как вы ожидаете.
Поскольку обнаружить результат выполнения команды
kill$ <b>kill -l 1234 >/dev/null 2>&1</b>Перенаправление ввода
Также как вывод вы можете перенаправить ввод. Например,
$ <b>more < killout.txt</b>Понятно, что это тривиальнейший пример для ОС Linux; команда
moreКаналы
Вы можете соединять процессы с помощью оператора канала (
|sortpsЕсли не применять каналы, придется использовать несколько шагов, подобных следующим:
$ <b>ps > psout.txt</b>$ <b>sort psout.txt > pssort.out</b>Соединение процессов каналом даст более элегантное решение:
$ <b>ps | sort > pssort.out</b>Поскольку вы, вероятно, захотите увидеть на экране вывод, разделенный на страницы, можно подсоединить третий процесс,
more$ <b>ps | sort | more</b>Практически нет ограничений на допустимое количество процессов. Предположим, что вы хотите видеть все имена выполняющихся процессов, за исключением командных оболочек. Можно применить следующую командную строку:
$ <b>ps -хо соmm | sort | uniq | grep -v sh | more</b>В ней берется вывод команды
psuniqgrep -v shshКак видите, это гораздо более элегантное решение, чем строка из отдельных команд, каждая со своими временными файлами. Но в этом случае имейте в виду следующее. Если строка состоит из команд, файл вывода создается или записывается сразу, как только сформирован набор команд, поэтому в строке из нескольких команд никогда не используйте дважды одно и то же имя файла. Если вы попытаетесь сделать что-то подобное:
<b>cat mydata.txt | sort | uniq > mydata.txt</b>то в результате получите пустой файл, т.к. вы перезапишете файл mydata.txt, прежде чем прочтете его.
Командная оболочка как язык программирования
Теперь, когда вы увидели некоторые базовые операции командной оболочки, самое время перейти к реальным программам оболочки. Есть два способа написания таких программ. Вы можете ввести последовательность команд и разрешить командной оболочке выполнить их в интерактивном режиме или сохранить эти команды в файле и затем запускать его как программу.
Интерактивные программы
Легкий и очень полезный во время обучения или тестирования способ проверить работу небольших фрагментов кода — просто набрать с клавиатуры в командной строке сценарий командной оболочки.
Предположим, что у вас большое количество файлов на языке С, и вы хотите проверить наличие в них строки
POSIXgrep$ <b>for file in *</b>> <b>do</b>> <b>if grep -l POSIX $file</b>> <b>then</b>