Как уже говорили другие, 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