>[me@linuxbox ~]$ ls -l ls-output.txt
>-rw-rw-r-- 1 me me 0 2012-02-01 15:08 ls-output.txt
Файл очистился! Это объясняется тем, что при перенаправлении вывода с помощью оператора > файл назначения всегда перезаписывается с самого начала. Поскольку команда ls не вывела никаких результатов, а только сообщение об ошибке, оператор перенаправления перезаписал файл, а затем остановился из-за ошибки, что привело к его очистке. Получается, что если вам понадобится очистить какой-нибудь файл (или создать новый, пустой файл), это можно сделать с помощью следующего трюка:
>[me@linuxbox ~]$ > ls-output.txt
Простой оператор перенаправления, без предшествующей ему команды, очистит существующий файл или создаст новый, пустой файл.
Так как же добавить вывод в конец существующего файлa, не затерев его? Для этого используем оператор перенаправления >>:
>[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
Оператор >> просто добавит результаты в конец файла. Если файл не существует, он будет создан, как при использовании оператора >. Давайте протестируем его:
>[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
>[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
>[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
>[me@linuxbox ~]$ ls -l ls-output.txt
>-rw-rw-r-- 1 me me 503634 2012-02-01 15:45 ls-output.txt
Мы повторили команду трижды и получили файл втрое большего размера.
Перенаправление стандартного вывода ошибок
Перенаправление стандартного вывода ошибок осуществляется не так просто, как стандартного вывода. Чтобы перенаправить стандартный вывод ошибок, нужно указать его дескриптор файла. Программа может производить вывод в любой из нескольких нумерованных файловых потоков. Первые три из них мы упомянули как стандартный ввод, вывод и вывод ошибок. Командная оболочка ссылается на них как на файловые дескрипторы 0, 1 и 2 соответственно. Командная оболочка поддерживает синтаксис перенаправления файлов с использованием номеров файловых дескрипторов. Так как стандартному выводу ошибок соответствует файловый дескриптор 2, мы можем перенаправить его, как показано ниже:
>[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt
Номер файлового дескриптора 2 помещается непосредственно перед оператором перенаправления, чтобы перенаправить стандартный вывод ошибок в файл ls-error.txt.
Перенаправление стандартного вывода и стандартного вывода ошибок в один файл
Иногда необходимо сохранить весь вывод команды в один файл. Для этого перенаправьте сразу два потока, стандартный вывод и стандартный вывод ошибок. Сделать это можно двумя способами. Первый — традиционный — работает в старых версиях командной оболочки: