作为BASH脚本的一部分,我想重复运行程序,然后将输出重定向到less
。该程序具有交互式元素,因此目标是当您通过窗口的X按钮退出程序时,它会通过脚本重新启动。该部分效果很好,但是当我使用管道对less
时,该程序不会自动重新启动,直到我去控制台并按q
。脚本的相关部分:
while :
do
program | less
done
我想在管道关闭时使less
退出,以便在没有任何用户干预的情况下重新启动程序。(这样,它的行为就好像管道不在那样,除非程序正在运行,否则您可以查阅控制台以查看当前运行的输出。)
也欢迎解决此问题的替代解决方案。
而不是退出less
,您可以简单地汇总program
的每次运行的输出吗?
while :
do
program
done | less
当program
与less
的一个有用功能相矛盾时,请退出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
属于kill
和lsof
。
#!/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