/ / Skrypt Bash nie jest zamykany natychmiast po wywołaniu `exit` - bash, scripting, exit, zakończ

Skrypt Bash nie jest zamykany natychmiast po wywołaniu `exit` - bash, scripting, exit, terminate

Mam następujący skrypt bash:

tail -F -n0 /private/var/log/system.log | while read line
do
if [ ! `echo $line | grep -c "launchd"` -eq 0 ]; then
echo "launchd message"
exit 0
fi
done

Z jakiegoś powodu jest to echo launchd message, czekając na pełne 5 sekund, i następnie wychodząc.

Dlaczego tak się dzieje i jak mogę to zrobić natychmiast po echo? launchd message?

Odpowiedzi:

9 dla odpowiedzi № 1

Ponieważ używasz rury, while pętla jest uruchamiana w podpowłoce. Zamiast tego uruchom go w głównej powłoce.

#!/bin/bash

while ...
do
...
done < <(tail ...)

3 dla odpowiedzi № 2

Jak wskazał Ignacio, twój tail | while tworzy podpowłokę. Opóźnienie jest spowodowane tym, że oczekuje na zapisanie następnej linii do pliku dziennika, zanim wszystko się zamknie.

Możesz dodać tę linię bezpośrednio przed swoim exit polecenie, jeśli nie chcesz używać podstawiania procesu:

kill -SIGPIPE $$

Niestety, nie znam żadnego sposobu kontrolowania kodu wyjścia za pomocą tej metody. Będzie to 141, które wynosi 128 + 13 (numer sygnału SIGPIPE).

Jeśli próbujesz uzależnić uruchamianie demona od innej, prawdopodobnie jest to lepszy sposób.

Przy okazji, jeśli naprawdę piszesz skrypt Bash (którego musisz użyć) <() proces zastępowania), możesz napisać swoje if lubię to: if [[ $line == *launchd* ]].


2 dla odpowiedzi nr 3

Możesz również wyjść z podpowłoki za pomocą bezpiecznego kodu zakończenia, a następnie przetestować wartość "$?" aby uzyskać taki sam efekt, jakiego szukasz:

tail -F -n0 /private/var/log/system.log | while read line
do
if [ ! `echo $line | grep -c "launchd"` -eq 0 ]; then
echo "launchd message"
exit 10
fi
done
if [ $? -eq 10 ]; then exit 0; fi