W systemach uniksopodobnych istnieją dwie ścieżki wyjściowe, które jeśli pozostaną niezmodyfikowane, wyślą dane wyjściowe na ekran. Standardowy błąd (lub stderr) to taki, który wychwytuje większość awarii i warunków błędów.
Aby przekazać komunikat o odmowie zezwolenia w stderr do tego samego strumienia wyjściowego co „zwykłe wyjście”, należy połączyć oba. W twoim przykładzie, grep -v
aby poprawnie na nim operować, łączysz stdout (standardowe wyjście) i stderr z tajemniczą składnią, którą widzisz.
Z podręcznika GNU Bash sekcja 3.2.2 Rurociągi :
If „ |&
” jest używany, command1 „S błąd standardowy, oprócz standardowe wyjście jest połączone command2 „s standardowe wejście przez przewód; jest skrótem od 2>&1 |
. To niejawne przekierowanie standardowego błędu na standardowe wyjście jest wykonywane po wszelkich przekierowaniach określonych przez polecenie.
Ponadto, jak wskazuje geirha, jeśli chcesz po prostu pozbyć się wydajności stderr, chciałbyś zrobić coś takiego
find -name 'myfile.*' 2> /dev/null
a może
find -name 'myfile.*' 2> /tmp/errorlog
I zauważ, że jeśli masz ciągi poleceń, takie jak find
przekazywanie ich danych wyjściowych xargs
, musisz umieścić cały potok poleceń w nawiasach, aby przechwycić dane wyjściowe ze wszystkich składników polecenia. Na przykład,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Jeśli pominąłeś nawiasy i zrobiłeś to zamiast tego -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
nadal widzisz błędy odmowy uprawnień z find lub egrep, ale stderr zostanie przekierowany dla xargs.
Jak widzieliście, prawdopodobnie wyrzucicie stderr dopiero po obejrzeniu jego zawartości podczas uruchomienia testowego.
Należy zauważyć, że z GNU find
io ile mogę powiedzieć, każdy POSIX find
The -print
opcja jest niejawna. Jeśli chcesz, możesz nadal podać je wyraźnie.