Недавно мы вот узнали, через какие потоки процесс пишет и читает данные. Теперь пора глянуть на операторы оболочки, которые позволяют перенаправлять потоки на разные источники данных. Например, вывод одной команды подать на вход другой либо записать stdout, stderr в файл.
Сделаем серию из 3 постов. Сегодня рассмотрим операторы для перенаправления вывода STDOUT и STDERR: >, >>. В следующие разы поговорим про STDIN и завершим тему оператором '|'.
Перенаправление потоков вывода:
Предположим, вы хотите создать файл, в который будет записан вывод STDOUT какой-то программы (разберем на примере date).
Для того, чтобы данные оказались в файле, нужно добавить символ '>' после команды и перед именем целевого файла:
$ date > date.txt
$ cat date.txt
Sat Dec 14 20:50:46 MSK 2024
Перенаправление вывода с использованием '>' создаст новый файл или полностью перезапишет содержимое существующего.
Использование '>>' позволяет также создать новый файл при отсутствии и добавить данные в его конец - без полной перезаписи:
$ date >> date.txt
$ cat date.txt
Sat Dec 14 20:50:46 MSK 2024
Sat Dec 14 20:51:40 MSK 2024
Подчеркну, что перенаправляется только STDOUT. Если программа писала ошибки в поток STDERR, они так и выведутся в терминал:
$ find /etc -type f > ~/results.txt
find: ‘/etc/ssl/private’: Permission denied
Давайте дополнительно обработаем и STDERR - для этого нам явно нужно указать номер целевого дескриптора "2>":
$ find /etc -type f > ~/results.txt 2> ~/errors.txt
$ cat ~/errors.txt
find: ‘/etc/ssl/private’: Permission denied
Также бывает полезно подчистить вывод какой-нибудь команды от всех ошибок. Для этого нам нужно перенаправить STDERR в "/dev/null":
$ find /etc -type f 2> /dev/null
Все, что попадает в "/dev/null" исчезает на веки вечные. Такой себе "black hole".
И, наконец, если нужно, чтобы всё попало в один файл, можно перенаправить оба потока в одно и то же место:
$ ls > /tmp/lsdata 2>&1
$ ls &> /tmp/lsdata
Выражение "2>&1" означает «отправлять stderr туда, куда направляется stdout».
LinuxCamp
