Как уже говорили другие, linux предоставляет два разных потока вывода:
stdout , или «стандартный вывод» - это то, куда идет весь обычный вывод.
Вы можете ссылаться на него, используя файловый дескриптор 1
.
stderr , или «стандартная ошибка» - это отдельный поток для внеполосной информации.
Вы можете ссылаться на него, используя файловый дескриптор 2
.
Почему два разных выходных потока? Рассмотрим конвейер воображаемых команд:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Теперь представьте, что decrypt
команда не работает и генерирует сообщение об ошибке. Если бы он отправил это сообщение stdout
, он бы отправил в канал, и если бы у него не было слова «секрет», вы бы его никогда не увидели. Таким образом, вы получите пустой выходной файл, не зная, что пошло не так.
Однако, поскольку канал захватывает только stdout
, decrypt
команда может отправлять свои ошибки туда stderr
, где они будут отображаться на консоли.
Вы можете перенаправить stdout
и stderr
, вместе или независимо:
# Send errors to "errors.txt" and output to "secrets.txt"
# The following two lines are equivalent, as ">" means "1>"
decrypt $MY_FILE 2> errors.txt > secrets.txt
decrypt $MY_FILE 2> errors.txt 1> secrets.txt
Вы можете перенаправить ошибки stdout
и обработать их, как если бы они были обычным выводом:
# The operation "2>&1" means "redirect file descriptor 2 to file
# descriptor 1. So this sends all output from stderr to stdout.
# Note that the order of redirection is important.
decrypt $MY_FILE > errors.txt 2>&1
# This may be confusing. It will store the normal output in a file
# and send error messages to stdout, where they'll be captured by
# the pipe and then sorted.
decrypt $MY_FILE 2>&1 > output.txt | sort
Вы также можете использовать сокращенную запись для перенаправления как stdout, так и stderr в один и тот же файл:
decrypt $MY_FILE &> output.txt
И, наконец, >
оператор сначала обрезает свой выходной файл перед записью в него. Если вместо этого вы хотите добавить данные в существующий файл, используйте >>
оператор:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1