Основы программирования в Linux - Мэтью Нейл
В предыдущем примере стандартный вывод перенаправлен в файл с помощью оператора
>
set -о noclobber
set -С
noclobber
set +о noclobber
set
Для дозаписи в конец файла используйте оператор
>>
$ <b>ps >> lsoutput.txt</b>
добавит вывод команды
ps
Для перенаправления стандартного потока ошибок перед оператором
>
2>
Предположим, что вы хотите применить команду
kill
kill
kill
Команда
$ <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
Каналы
Вы можете соединять процессы с помощью оператора канала (
|
sort
ps
Если не применять каналы, придется использовать несколько шагов, подобных следующим:
$ <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>
В ней берется вывод команды
ps
uniq
grep -v sh
sh
Как видите, это гораздо более элегантное решение, чем строка из отдельных команд, каждая со своими временными файлами. Но в этом случае имейте в виду следующее. Если строка состоит из команд, файл вывода создается или записывается сразу, как только сформирован набор команд, поэтому в строке из нескольких команд никогда не используйте дважды одно и то же имя файла. Если вы попытаетесь сделать что-то подобное:
<b>cat mydata.txt | sort | uniq > mydata.txt</b>
то в результате получите пустой файл, т.к. вы перезапишете файл mydata.txt, прежде чем прочтете его.
Командная оболочка как язык программирования
Теперь, когда вы увидели некоторые базовые операции командной оболочки, самое время перейти к реальным программам оболочки. Есть два способа написания таких программ. Вы можете ввести последовательность команд и разрешить командной оболочке выполнить их в интерактивном режиме или сохранить эти команды в файле и затем запускать его как программу.
Интерактивные программы
Легкий и очень полезный во время обучения или тестирования способ проверить работу небольших фрагментов кода — просто набрать с клавиатуры в командной строке сценарий командной оболочки.
Предположим, что у вас большое количество файлов на языке С, и вы хотите проверить наличие в них строки
POSIX
grep
$ <b>for file in *</b>
> <b>do</b>
> <b>if grep -l POSIX $file</b>
> <b>then</b>