管道关闭时退出更少

  • 本文关键字:退出 管道 bash
  • 更新时间 :
  • 英文 :


作为BASH脚本的一部分,我想重复运行程序,然后将输出重定向到less。该程序具有交互式元素,因此目标是当您通过窗口的X按钮退出程序时,它会通过脚本重新启动。该部分效果很好,但是当我使用管道对less时,该程序不会自动重新启动,直到我去控制台并按q。脚本的相关部分:

while :
do
    program | less
done

我想在管道关闭时使less退出,以便在没有任何用户干预的情况下重新启动程序。(这样,它的行为就好像管道不在那样,除非程序正在运行,否则您可以查阅控制台以查看当前运行的输出。)

也欢迎解决此问题的替代解决方案。

而不是退出less,您可以简单地汇总program的每次运行的输出吗?

while :
do
    program
done | less

programless的一个有用功能相矛盾时,请退出less


更新:这是使用背景过程在时间时杀死less的尝试。它假设读取输出文件的唯一程序是杀死的less

while :
do
    ( program > /tmp/$$-program-output; kill $(lsof -Fp | cut -c2-) ) &
    less /tmp/$$-program-output
done

program将其输出写入文件。退出后,kill命令使用lsof找出正在读取文件的过程,然后杀死文件。请注意,有种族条件;less需要在program存在之前开始。如果这是一个问题,可以可能会解决,但我会避免将答案混乱。

您可以尝试杀死流程组program,而less属于killlsof

#!/bin/bash
trap 'kill 0' EXIT
while :
do
   # script command gives sh -c own process group id (only sh -c cmd gets killed, not entire script!)
   # FreeBSD script command
   script -q /dev/null sh -c '(trap "kill -HUP -- -$$" EXIT; echo hello; sleep 5; echo world) | less -E -c'
   # GNU script command
   #script -q -c 'sh -c "(trap "kill -HUP -- -$$" EXIT; echo hello; sleep 5; echo world) | less -E -c"' /dev/null
   printf 'n%snn' "you now may ctrl-c the program: $0" 1>&2
   sleep 3
done

虽然我同意Chepner的建议,但如果您真的想要单独的less实例,我认为Man Page的此项目将帮助您:

   -e or --quit-at-eof
          Causes less to automatically exit the second time it reaches end-of-file.  By  default,
          the only way to exit less is via the "q" command.
   -E or --QUIT-AT-EOF
          Causes less to automatically exit the first time it reaches end-of-file.

您可以在LESS Envir变量

中可以看到此选项。
export LESS="-E"
while : ; do
    program | less
done

ihth

相关内容

  • 没有找到相关文章

最新更新