2013-07-10 13 views
5

Korzystam z następującego kodu, aby wysłać stderr do pliku.wysyłaj stashr bash do pliku dziennika, ale tylko wtedy, gdy wystąpi błąd

.script >2 "errorlog.$(date)" 

Problem polega na tym, że pusty plik dziennika jest tworzony przy każdym uruchomieniu skryptu, nawet jeśli błąd nie istnieje. Sprawdziłem również w Internecie, w kilku książkach, i nie mogę dowiedzieć się, jak utworzyć plik dziennika, tylko jeśli istnieją błędy.

Odpowiedz

5

Przekierowanie wyjścia otwiera plik przed uruchomieniem skryptu, więc nie ma możliwości sprawdzenia, czy plik otrzyma dane wyjściowe. Co można zrobić, jest jednak od razu usunąć plik, jeśli to nakręca jest pusty:

logfile="errorlog.$(date)" 
# Note your typo; it's 2>, not >2 
script 2> "$logfile"; [ -s "$logfile" ] || rm -f "$logfile" 

używam -f na wszelki wypadek, jak -s może zawieść jeśli $logfile nie istnieje, nie tylko jeśli jest pusty. Używam ; do rozdzielania poleceń, ponieważ niezależnie od tego, czy coś zawiera $logfile, nie zależy od tego, czy script się powiedzie, czy nie.

Możesz zawinąć to w funkcję, aby ułatwić jej używanie.

save_log() { 
    logfile=${1:-errorlog.$(date)} 
    cat - > "$logfile" 
    [ -s "$logfile" ] || rm -f "$logfile" 
} 

script 2> >(save_log) 
script 2> >(save_log my_logfile.txt) 

Niezupełnie tak proste, jak przekierowanie do pliku, a zależy od niestandardowych funkcji (substytucji procesowej), ale nie jest tak źle, albo.

+0

Utworzono przykładowy skrypt z błędem i użyłem twojego pierwszego przykładu. Za każdym razem pomyślnie tworzy nowy plik dziennika. Nadal tworzy pusty plik dziennika, mimo że uruchamiam skrypt, ale nie usuwa go. Czy uważasz, że muszę zmienić część rm? – bkstack

+0

Mam to. Nie umieszczałem./Przed $ logfile Użyłem następujących sposobów, aby to naprawić. logfile = "errorlog. $ (Date)" ./script 2> "./

/$ logfile"; [-s "./ /$ plik dziennika"] || rm -f "./ $ logfile" Dodałem również tryb uśpienia pomiędzy utworzeniem i usunięciem pliku, aby upewnić się, że działa. Dzięki za pomoc chepner! logfile = "errorlog. $ (Date)" ./script 2> "./ /$ logfile"; spać 2; [-s "./ /$ plik dziennika"] || rm -f "./ /$ plik dziennika" – bkstack

Powiązane problemy