gpt4 book ai didi

bash - 字符串检测时退出尾部

转载 作者:行者123 更新时间:2023-12-05 00:59:39 26 4
gpt4 key购买 nike

我正在编写一个障碍来阻止脚本的执行,直到记录了某个关键字。脚本很简单:

tail -F -n0 logfile.log | while read LINE; do
[[ "$LINE" == *'STOP'* ]] && echo ${LINE} && break;
done

tail -F -n0 logfile.log | grep -m1 STOP

问题是它不会在检测到关键字后立即退出,而只是在写入下一行之后。即:

printf "foo\n"  >> logfile.log  # keeps reading
printf "foo\n" >> logfile.log # keeps reading
printf "STOP\n" >> logfile.log # STOP printed
printf "foo\n" >> logfile.log # code exits at last

不幸的是,我不能依赖在“STOP”之后将记录另一行的事实(至少不在对我的目的有用的间隔内)。

到目前为止找到的解决方法是 tail 另一个我知道肯定会经常更新的文件,但是什么是“干净”的解决方案,以便代码在记录后立即退出 停止

最佳答案

, 执行形式的命令时

command1 | command2

and command2 死亡或终止,从 command1 接收 /dev/stdout 的管道损坏。但是,这不会立即终止 command1

所以要实现你想要的就是使用进程替换而不是管道

awk '/STOP/{exit}1' < <(tail -f logfile)

当您使用 时,您可以更详细地查看该行为:

$ touch logfile
$ tail -f logfile | awk '/STOP/{exit}1;END{print "end"}'

这个awk 程序将检查是否看到“STOP”,如果没有则再次打印该行。如果看到“STOP”,它将打印“end”

当你在另一个终端做时

$ echo "a" >> logfile
$ echo "STOP" >> logfile
$ echo "b" >> logfile

你看 打印以下输出:

a             # result of print
end # awk test STOP, exits and executes END statement

此外,如果您仔细观察,您会发现 此时已终止。

ps 在发送“STOP”之前:

13625 pts/39   SN     0:00  |        \_ bash
32151 pts/39 SN+ 0:00 | \_ tail -f foo
32152 pts/39 SN+ 0:00 | \_ awk 1;/STOP/{exit}1;END{print "end"}

ps 发送“STOP”后:

13625 pts/39   SN     0:00  |        \_ bash
32151 pts/39 SN+ 0:00 | \_ tail -f foo

因此 awk 程序终止了,但 tail 并没有崩溃,因为它还没有意识到管道已损坏,因为它没有尝试写入它。

当您在终端中使用管道执行以下操作时,您会看到 tail 的退出状态:

$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
$ 141 0

这表明 awk 很好地终止,但 tail 以退出代码 141 终止,这意味着 SIGPIPE

关于bash - 字符串检测时退出尾部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52813302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com