6

我有以下 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

4

3 回答 3

9

由于您使用的是管道,因此while循环正在子外壳中运行。而是在主 shell 中运行它。

#!/bin/bash

while ...
do
   ...
done < <(tail ...)
于 2010-10-28T22:31:00.213 回答
3

正如 Ignacio 所指出的,您tail | while创建了一个子外壳。延迟是因为它正在等待下一行在所有内容关闭之前写入日志文件。

exit如果您不想使用进程替换,可以在命令之前立即添加此行:

kill -SIGPIPE $$

不幸的是,我不知道使用这种方法控制退出代码的任何方法。它将是 141,即 128 + 13(的信号数SIGPIPE)。

如果你试图让一个守护进程的启动依赖于另一个已经启动的守护进程,那么可能有更好的方法来做到这一点。

顺便说一句,如果你真的在写一个 Bash 脚本(你必须使用进程替换) ,<()你可以if这样写:if [[ $line == *launchd* ]]

于 2010-10-29T01:22:24.180 回答
2

你也可以用一个退出代码退出子shell,然后测试“$?”的值。为了获得您正在寻找的相同效果:

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
于 2013-04-25T20:16:50.787 回答