Polecenie Kyle'a dla systemu Unix / Linux ma za zadanie przełączanie STDERR za pomocą STDOUT; jednak wyjaśnienie nie jest całkiem poprawne. Operatorzy przekierowujący nie kopiują ani nie kopiują, po prostu przekierowują przepływ w innym kierunku.
Przepisanie polecenia Kyle'a poprzez tymczasowe przesunięcie 3> i 1 do końca ułatwiłoby zrozumienie koncepcji:
find /var/log 1>&2 2>&3 3>&1
Napisany w ten sposób Linux wyświetli błąd, ponieważ & 3 jeszcze nie istnieje, ponieważ znajduje się przed 3> i 1. 3> coś jest sposobem na zadeklarowanie (zdefiniowanie), że użyjemy trzeciej rury, więc musi być zlokalizowana przed dopływem wody do tej rury, na przykład sposób, w jaki Kyle ją napisał. Spróbuj tego w inny sposób dla zabawy:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Szkoda, że nie można robić kopii. Nie możesz robić rzeczy takich jak „3> i 1 3> i 2” w tym samym poleceniu, ponieważ Linux użyje tylko pierwszego znalezionego i odrzuca drugi.
Nie znalazłem (jeszcze) sposobu, aby wysłać zarówno błąd, jak i zwykłe wyjście do pliku, a także wysłać kopię błędu do standardowego wyjścia za pomocą jednego polecenia. Na przykład mam zadanie cron, które chcę, aby oba dane wyjściowe (błąd i standard) trafiły do pliku dziennika i pozwolić, aby błąd również zgasł, aby wiadomość e-mail została wysłana do mojego BlackBerry. Mogę to zrobić za pomocą dwóch poleceń za pomocą „tee”, ale błąd nie pojawia się we właściwej kolejności wśród zwykłych wierszy wyjściowych w pliku. W ten sposób rozwiązałem problem:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Zauważ, że muszę użyć log1 dwa razy i muszę dołączyć w obu przypadkach, pierwszy używa opcji „-a” dla polecenia „tee”, a drugi używa „>>”.
Robiąc log kota 1 otrzymujesz:
STD1
STD2
-bash: sdfr: command not found
Zauważ, że błąd nie pojawia się w drugim wierszu tak, jak powinien.