Nie jestem pewien, jaka jest najlepsza kolejność przechwytywania zarówno do, jak STDERR
i STDOUT
do tego samego pliku za pomocą tee
. Wiem, że jeśli chcę potokować do pliku, muszę mapować uchwyt pliku po przekierowaniu, tj
find . >/tmp/output.txt 2>&1
To instruuje powłokę, aby wysłać STDOUT
do, /tmp/output.txt
a następnie wysłać STDERR
do STDOUT
(który teraz wysyła do /tmp/output.txt
).
Próba wykonania 2>&1
przed przekierowaniem pliku nie przyniesie pożądanego efektu.
Jednak gdy chcę używać potoku, tee
powinno to być:
find . |tee /tmp/output.txt 2>&1 # or
find . 2>&1 |tee /tmp/output.txt # ?
|&
zostanie użyty, standardowy błąd polecenia 1 jest połączony ze standardowym wejściem polecenia 2 przez potok; jest to skrót2>&1 |
. To niejawne przekierowanie standardowego błędu jest wykonywane po wszelkich przekierowaniach określonych przez polecenie”.stderr
istdout
do zrozumienia tego problemu. Operatory przekierowania>
i trójnika|
różnią się podczas próby przechwycenia obu strumieni wyjściowych. Do przekierowania musiałem./testapp > /tmp/out.log 2>&1
. Natomiast na tee musiałem./testapp 2>&1 | tee /tmp/out.log
.|
zwykle jest określany jako operator potoku.tee
odnosi się tylko do konkretnego programu, który jest wywoływany na drugim końcu potoku.