gpt4 book ai didi

bash - 在 bash 中退出管道

转载 作者:行者123 更新时间:2023-11-29 09:00:41 27 4
gpt4 key购买 nike

对于以下 bash 语句:

tail -Fn0 /tmp/report | while [ 1 ]; do echo "pre"; exit; echo "past"; done

我得到了“pre”,但没有退出到 bash 提示符,然后如果我在/tmp/report 中输入一些东西,我可以退出这个脚本并进入 bash 提示符。

我认为这是合理的。 'exit' 使 'while' 语句退出,但 'tail' 仍然存在。如果有东西输入到/tmp/report,'tail'会输出到管道,然后'tail'会检测到管道关闭,然后'tail'退出。

  1. 我说得对吗?如果不是,谁能提供正确的解释?
  2. 是否可以在“while”语句中添加任何内容以立即退出整个管道语句?我知道我可以将 tail 的 pid 保存到一个临时文件中,然后在“while”中读取这个文件,然后杀死 tail。有没有更简单的方法?
  3. 让我扩大我的问题。如果在脚本文件中使用这个tail|while,是否可以同时完成以下项目?A。如果输入 Ctrl-C 或向主 shell 进程发出信号,则主 shell 和由主 shell 派生的各种子 shell 和后台进程将退出b.我可以从 tail|while 退出,而只在触发情况下,并保持其他子进程继续运行C。最好不要使用临时文件或管道文件。

最佳答案

你是对的。 while 循环在子 shell 中执行,因为它的输入被重定向,而 exit 只是从该子 shell 中退出。

如果您运行的是 bash 4.x,则可以通过协进程实现您想要的效果。

coproc TAIL { tail -Fn0 /tmp/report.txt ;}
while [ 1 ]
do
echo "pre"
break
echo "past"
done <&${TAIL[0]}
kill $TAIL_PID

http://www.gnu.org/software/bash/manual/html_node/Coprocesses.html

对于旧版本,您可以使用后台进程写入命名管道:

pipe=/tmp/tail.$$
mkfifo $pipe
tail -Fn0 /tmp/report.txt >$pipe &
TAIL_PID=$!
while [ 1 ]
do
echo "pre"
break
echo "past"
done <$pipe
kill $TAIL_PID
rm $pipe

关于bash - 在 bash 中退出管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20558295/

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