2012-06-27 5 views
27

Mam skrypt bash, który ma w sobie set -x. Czy możliwe jest przekierowanie wydruków debugowania tego skryptu i wszystkich jego wyników do pliku? Idealnie chciałabym zrobić coś takiego:Przekierowanie wszystkich danych wyjściowych w skrypcie bash przy użyciu zestawu -x

#!/bin/bash 
set -x 
(some magic command here...) > /tmp/mylog 
echo "test" 

i uzyskać wyjście w/tmp/mylog

+ echo test 
test 

, a nie standardowe wyjście.

+1

Zobacz [to pytanie] (http://stackoverflow.com/questions/692000/how-do-i-write-stderr-to-a-file-while-using-tee-with-a-pipe). To nie jest duplikat, ale uważam, że powinno to odpowiedzieć na twoje pytanie. – vergenzt

Odpowiedz

39

To co właśnie google i pamiętam siebie za pomocą tego jakiś czas temu ...

Używaj exec przekierować zarówno standardowe wyjście i błąd standardowy wszystkich poleceń w skrypcie:

#!/bin/bash 
logfile=$$.log 
exec > $logfile 2>&1 

więcej przekierowania magii sprawdzeniu Advanced Bash Scripting Guide - I/O Redirection.

Jeśli chcesz zobaczyć wyjście i debugowanie na terminalu w dodając do pliku dziennika, zobacz redirect COPY of stdout to log file from within bash script itself.

Jeśli chcesz obsługiwać cel wyjścia set -x śladowej niezależnie od normalnego STDOUT i STDERR patrz bash storing the output of set -x to log file.

+0

Interesujące. W jaki sposób mogę użyć tej metody do przechwytywania błędów (stdout 2) do pliku logu i zwracania ich do stdout 2; aby cron mógł poprawnie wysyłać powiadomienia o błędach? –

+0

@JoeyT, sprawdź, czy to działa: wykonaj kopię zapasową STDOUT przed ustawieniem pliku dziennika za pomocą 'exec 3 <& 1', następnie dodaj na końcu te dwie linie:' exec 1 <& 3 3 <& - 'i' cat $ $ .log' - powinno to przywrócić STDOUT i zamknąć fd 3 do czyszczenia. Na podstawie oryginalnego odniesienia 'tldp' i tego [http://tldp.org/LDP/abs/html/ioredirintro.html](http://tldp.org/LDP/abs/html/ioredirintro.html) – nik

+0

@ JoeyT Edytowałem odpowiedź i dodałem dwa pomocne linki; pierwszy powinien wystarczyć, aby wyjaśnić, jak możesz to zrobić. –

11

wyjście -x idzie do stderr, więc do logowania to zrobić:

set -x 
exec 2>/tmp/mylog 
Powiązane problemy