Основы программирования в Linux | страница 32
Каналы и перенаправление
Прежде чем заняться подробностями программ командной оболочки, необходимо сказать несколько слов о возможностях перенаправления ввода и вывода программ (не только программ командной оболочки) в ОС Linux.
Перенаправление вывода
Возможно, вы уже знакомы с некоторыми видами перенаправления, например, таким как:
>$ ls -l > lsoutput.txt
сохраняющим вывод команды ls в файле с именем lsoutput.txt.
Однако перенаправление позволяет сделать гораздо больше, чем демонстрирует этот простой пример. В главе 3 вы узнаете больше о дескрипторах стандартных файлов, а сейчас вам нужно знать только то, что дескриптор файла 0 соответствует стандартному вводу программы, дескриптор файла 1 — стандартному выводу, а дескриптор файла 2 — стандартному потоку ошибок. Каждый из этих файлов можно перенаправлять независимо друг от друга. На самом деле можно перенаправлять и другие дескрипторы файлов, но, как правило, нет нужды перенаправлять любые другие дескрипторы, кроме стандартных: 0, 1 и 2.
В предыдущем примере стандартный вывод перенаправлен в файл с помощью оператора >>
. По умолчанию, если файл с заданным именем уже есть, он будет перезаписан. Если вы хотите изменить поведение по умолчанию, можно применить команду >set -о noclobber
(или >set -С
), которая устанавливает опцию >noclobber
, чтобы помешать перезаписи при перенаправлении. Отменить эту опцию можно с помощью команды >set +о noclobber
. Позже в этой главе будут приведены другие опции команды >set
.
Для дозаписи в конец файла используйте оператор >>>
. Например, команда
>$ ps >> lsoutput.txt
добавит вывод команды >ps
в конец заданного файла.
Для перенаправления стандартного потока ошибок перед оператором >>
вставьте номер дескриптора файла, который хотите перенаправить. Поскольку у стандартного потока ошибок дескриптор файла 2, укажите оператор >2>
. Часто бывает полезно скрывать стандартный поток ошибок, запрещая вывод его на экран.
Предположим, что вы хотите применить команду >kill
для завершения процесса из сценария. Всегда существует небольшой риск, что процесс закончится до того, как выполнится команда >kill
. Если это произойдет, команда kill выведет сообщение об ошибке в стандартный поток ошибок, который по умолчанию появится на экране. Перенаправив стандартный вывод команды и ошибку, вы сможете помешать команде >kill
выводить какой бы то ни было текст на экран.
Команда
>$ kill -HUP 1234 >killout. txt 2>killer.txt
поместит вывод и информацию об ошибке в разные файлы.