Jak powiedzieli inni, linux zapewnia dwa różne strumienie wyjściowe:
standardowe wyjście , czyli „standardowe wyjście”, jest tym, do czego trafiają wszystkie zwykłe wyjścia.
Możesz odwoływać się do niego za pomocą deskryptora pliku 1
.
stderr lub „błąd standardowy” to osobny strumień dla informacji poza pasmem.
Możesz odwoływać się do niego za pomocą deskryptora pliku 2
.
Dlaczego dwa różne strumienie wyjściowe? Rozważ szereg wymyślonych poleceń:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Teraz wyobraź sobie, że decrypt
polecenie kończy się niepowodzeniem i generuje komunikat o błędzie. Gdyby wysłał tę wiadomość stdout
, wysłałby ją do potoku, a gdyby nie miał słowa „sekret”, nigdy by go nie zobaczył. W rezultacie otrzymałeś pusty plik wyjściowy, nie mając pojęcia, co poszło nie tak.
Ponieważ jednak rura tylko przechwytuje stdout
, decrypt
polecenie może wysłać swoje błędy do stderr
, gdzie zostaną wyświetlone na konsoli.
Możesz przekierować stdout
i stderr
razem lub osobno:
# 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
Możesz przekierować błędy stdout
i przetworzyć je tak, jakby były normalnym wyjściem:
# 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
Można również użyć „skrótowej” notacji przekierować zarówno stdout i stderr do tego samego pliku:
decrypt $MY_FILE &> output.txt
I na koniec >
operator najpierw obetnie swój plik wyjściowy przed zapisaniem do niego. Jeśli zamiast tego chcesz dołączyć dane do istniejącego pliku, użyj >>
operatora:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1