Библиотека сайта rus-linux.net
3. Всё о перенаправлении
3.1 Теория и беглый взгляд
Есть 3 файловых дескриптора: stdin - cтандартный ввод, stdout - стандартный вывод и stderr - стандартный поток ошибок.
Ваши основные возможности:
- перенаправлять stdout в файл
- перенаправлять stderr в файл
- перенаправлять stdout в stderr
- перенаправлять stderr в stdout
- перенаправлять stderr и stdout в файл
- перенаправлять stderr и stdout в stdout
- перенаправлять stderr и stdout в stderr
Небольшое примечание для понимания: с помощью команды less Вы можете смотреть как stdout, который остаётся в буфере, так и stderr, который печатается на экране, но стирается, когда Вы пытаетесь "просмотреть" буфер.
3.2 Пример: stdout в файл
Это действие записывает стандартный вывод программы в файл.
ls -l > ls-l.txt
Здесь создаётся файл, названный 'ls-l.txt', и в нём будет содержаться
то, что бы Вы увидели, если бы ввели команду 'ls -l' и выполнили её.
3.3 Пример: stderr в файл
Это действие записывает стандартный поток ошибок программы в файл.
grep da * 2> grep-errors.txt
Здесь создаётся файл, названный 'grep-errors.txt', и в нём будет
содержаться часть вывода команды 'grep da *', относящаяся к
стандартному потоку ошибок.
3.4 Пример: stdout в stderr
Это действие записывает стандартный вывод программы туда же, куда и стандартный поток ошибок.
grep da * 1>&2
Здесь стандартный вывод команды посылается в стандартный поток ошибок,
Вы можете увидеть это разными путями.
3.5 Sample: stderr 2 stdout
Это действие записывает стандартный поток ошибок программы туда же, куда и стандартный вывод.
grep * 2>&1
Здесь стандартный поток ошибок команды посылается на стандартный вывод;
если Вы перешлёте результат через конвейер (|) в less, то увидите, что
строки, которые обычно пропадают (как записанные в стандартный поток
ошибок) в этом случае сохраняются (потому что они на стандартном выводе).
3.6 Пример: stderr и stdout в файл
Это действие помещает весь вывод программы в файл. Это иногда подходит для cron'овских заданий, если Вы хотите, чтобы команда выполнялась абсолютно незаметно.
rm -f $(find / -name core) &> /dev/null
Это (предположим, на cron'овском задании) удаляет любой файл с
названием 'core' в любом каталоге. Помните, что Вы должны быть
полностью уверены в том, что делает команда, если хотите затереть
её вывод.
Next Previous Contents