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