Patrząc na dwa polecenia osobno:
utility 2>&1 >output.log
Ponieważ przekierowania są przetwarzane od lewej do prawej, standardowy strumień błędów byłby najpierw przekierowywany do dowolnego miejsca, w którym idzie standardowy strumień wyjściowy (ewentualnie do konsoli), a następnie standardowy strumień wyjściowy byłby przekierowywany do pliku. Standardowy strumień błędów nie zostałby przekierowany do tego pliku.
Widocznym efektem tego jest to, że otrzymujesz to, co jest generowane przy standardowym błędzie na ekranie, i to, co jest wytwarzane przy standardowym wyjściu w pliku.
utility 2>&1 | tee output.log
Tutaj przekierowujesz standardowy błąd w to samo miejsce, co standardowy strumień wyjściowy. Oznacza to, że oba strumienie będą przesyłane do tee
narzędzia jako pojedynczy, przeplatany strumień wyjściowy, i że te standardowe dane wyjściowe zostaną zapisane w danym pliku przez tee
. Dane byłyby dodatkowo odtwarzane przez tee
konsolę (w ten tee
sposób duplikuje strumienie danych).
To, które z nich zostanie użyte, zależy od tego, co chcesz osiągnąć.
Zauważ, że nie byłbyś w stanie odtworzyć efektu drugiego potoku tylko za pomocą >
(jak w utility >output.log 2>&1
, co zapisałoby zarówno standardowe wyjście, jak i błąd w pliku). Musisz użyć, tee
aby uzyskać dane w konsoli, a także w pliku wyjściowym.
Dodatkowe uwagi:
The Widoczny efekt pierwszego polecenia
utility 2>&1 >output.log
byłby taki sam jak
utility >output.log
To znaczy, standardowe wyjście trafia do pliku, a standardowy błąd trafia do konsoli.
Gdyby na końcu każdego z powyższych poleceń dodano kolejny krok przetwarzania, istniałaby duża różnica:
utility 2>&1 >output.log | more_stuff
utility >output.log | more_stuff
W pierwszym potoku more_stuff
uzyskałby to, co pierwotnie jest standardowym strumieniem błędów, utility
jako swoje standardowe dane wejściowe, natomiast w drugim potoku, ponieważ jest to tylko wynikowy standardowy strumień wyjściowy, który jest kiedykolwiek wysyłany przez potok, more_stuff
część potoku nie otrzyma nic czytać na jego standardowym wejściu.
utility 2>&1 | tee output.log
masz na myśli, że ponieważ 1 jest kierowane do tee, również 2. 2. Ponieważ tee duplikuje strumień, dane wyjściowe są wyświetlane zarówno na konsoli, jak i zapisywane do pliku? Stąd różnica międzyutility 2>&1 > output.log
iutility 2>&1 | tee output.log
polegatee
na tym, że powiela strumień. Czy to prawda?