Як говорили інші, 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