假设 bash 中有以下虚拟命令:
### dummy long_operation_cmd function, for easy reproduction:
function long_operation_cmd() {
echo "operation 1"
sleep 5
echo "operation 2"
}
我目前正在通过以下方式运行 bash 脚本:
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' \
&& rm /tmp/logfile.tmp
这允许我在后台安全地运行长操作,跟踪输出,并确保 Ctrl+C 不会中断执行。
最重要的是,当操作完成后,sed
让我退出跟随模式。
我想用 替换tail -f
,less +F
这就是我想出的:
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
less +F -- /tmp/logfile.tmp \
&& rm /tmp/logfile.tmp
===ALL DONE===
但是,当达到模式(或long_operation_cmd
操作完成时)时,我想不出一种方法来自动脱离跟随模式。
关于解决这个问题的任何建议?
您可以在“ALL DONE”时向进程发送 SIGINT 信号:
但是,这需要您知道 PID(
less +F
也可以在后台运行?)。看来我要另辟蹊径了。
我将
tail -f
首先捕获 Ctrl-C,然后再减少。如果一切顺利,我将不会运行less
,但如果tail
“失败”(这是使用 Ctrl+C 的情况),我将启动更少 - 如果需要,我可以在更少的范围内继续使用“F”。最终结果将如下所示: