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