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