Wiem, że dobrze zachowujące się narzędzia, takie jak grep, wysyłają „standardowe” komunikaty do standardowego wyjścia, a komunikaty o błędach do standardowego.
$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory
Kiedy sam piszę skrypty powłoki, często trudno mi zdecydować, jakie dane wyjściowe i jakie komunikaty powinienem przedstawić na stderr, czy też powinienem w ogóle się tym przejmować.
Chciałbym wiedzieć o dobrych praktykach: kiedy przekierowanie jakiejś wiadomości do stderr jest wymagane i uzasadnione, a kiedy nie?
„To zależy”, jasne, ale czy masz jakieś spostrzeżenia, które pomogłyby mi w podjęciu tych decyzji?
Aby dostosować to subiektywne pytanie do formatu, chciałbym zachęcić do odpowiedzi, które odnoszą się do „dlaczego”, i są informowane przez doświadczenie i, jeśli to możliwe, poparte faktami.
Odpowiedzi:
Milczenie jest złotem. Nie wysyłaj nic, jeśli wszystko jest w porządku.
Najłatwiejszy sposób na oddzielenie stderr od stdout: wyobraź sobie, że wszystkie dane wyjściowe skryptów zostaną przekierowane do innego polecenia za pomocą potoku. W takim przypadku powinieneś zachować wszystkie powiadomienia w stderr, ponieważ takie nieoczekiwane informacje w stdout mogą uszkodzić sekwencję potoku.
Czasami także w rurach takich jak ta:
musisz przekazać coś
command2
do danych wyjściowych użytkowników. Najłatwiejszym sposobem bez plików tymczasowych jest stderr.źródło
echo
niektóre zmienne, pokazują, co zostało zrobione, pokazują postęp). Waham się, aby umieścić wszystko na stderr, ponieważ te komunikaty logowania to wszystko, co skrypt kiedykolwiek wyświetli. Nie jestem pewien, jak zastosować pomysł rury w takich sytuacjach.Ogólnie piszę wszystko, co dotyczy operacji aplikacji
stderr
,stdout
jest zarezerwowane dla danych.Wyobraź sobie taką aplikację
cat
. Kiedy używasz go do odczytu danych wejściowych i przekazujesz do innej aplikacji (za pomocą potoku), nie chcesz, aby dane wyjściowe były zaśmiecone komunikatami o stanie.Wszystko, co może być interesujące dla innej aplikacji lub postprocesora mojej aplikacji, będzie do
stdout
wszystkiego, co będzie dotyczyło tylko wewnętrznej strony mojej aplikacjistderr
.źródło
Moje osobiste preferencje to wysyłanie komunikatów o błędach i wyjątków
stderr
oraz komunikatów informacyjnych na adresstdout
. IMOstderr
jest dla wyjątków i stąd moja konwencja.źródło