/ / Баш-скрипт не виходить відразу після виклику `exit` - bash, scripting, exit, end

Баш-скрипт не виходить відразу після виклику `exit` - bash, scripting, exit, end

Я маю наступний скрипт 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

З якоїсь причини це ехо launchd message, чекаючи повного 5 секунд, і потім виїжджаючи

Чому це відбувається і як я можу це вийти відразу після його ехо launchd message?

Відповіді:

9 для відповіді № 1

Оскільки ви використовуєте трубу, то while петля запускається в підоболоці. Запустіть його в основній оболонці.

#!/bin/bash

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

3 для відповіді № 2

Як зазначив Ігнасіо, ваш tail | while створює підключення. Затримка полягає в тому, що вона очікує, що наступний рядок буде записано до файла журналу, перш ніж все закриється.

Ви можете додати цей рядок безпосередньо перед вашим exit команду, якщо ви віддаєте перевагу не використовувати процес заміни:

kill -SIGPIPE $$

На жаль, я не знаю який-небудь спосіб контролювати код виходу за допомогою цього методу. Це буде 141, тобто 128 + 13 (номер сигналу SIGPIPE)

Якщо ви намагаєтесь запустити запуск демону залежним від іншого, який почав, то, можливо, є кращий спосіб це зробити.

До речі, якщо ви дійсно пишете сценарій Bash (який ви повинні використовувати <() процес заміни), ви можете написати свій if подобається це: if [[ $line == *launchd* ]].


2 для відповіді № 3

Ви також можете вийти з підсхеми з кодом виходу з тегами, а потім перевірити значення "$?" щоб отримати той же ефект, який ви шукаєте:

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