我for
在交互式bash
会话中开始了一个循环。对于这个问题,我们可以假设循环类似于
for i in dir/*; do
program "$i"
done > log
该命令花费的时间比预期的要长得多,并且仍在运行。如何查看运行for
循环的当前进度。
非解决方案:
- 看
log
。
不起作用,因为:program
预计会静默运行。您可以将其program
视为验证者。如果循环完成而没有任何输出,那么我很高兴。 - 停止循环。添加某种进度指示(例如
echo "$i"
)。再次开始循环。
不起作用,因为:循环已经运行了几个小时。我不想浪费在当前跑步中投入的所有时间和精力。我假设一切正常。我只是好奇,想知道目前的进展。 - Ctrl+ Zthen
set -x; fg
不起作用,因为:bash
使用时不继续循环fg
。只有循环内的当前/下一个命令将运行后fg
,循环退出。您可以使用for i in {1..200}; do printf '%s ' $i; /usr/bin/sleep 0.5; done
.
通配符
dir/*
总是以相同的顺序展开。此功能与 的当前值一起$i
可用于显示进度信息。$i
可以通过查看系统上运行的进程来检索的当前值。以下命令打印当前运行的实例program
及其参数。如果有多个
program
进程,您可能希望使用--parent ...
for 选项pgrep
仅匹配由运行for
您要检查的循环的 shell 启动的进程。手动提取值
$i
,然后使用这在两个假设下有效
的内容
dir/
在运行循环时不会改变。如果program
创建、重命名或删除文件,则数字可能是错误的。调用会
program
启动一个新进程。如果program
是一个bash
函数,那么不会有program
. 如果函数function
本身调用另一个启动新进程的程序,那么您可以查找该子程序。但是,如果program
是内置 bash(由 列出的命令help
)或纯 bash 函数(仅使用bash
内置函数),那么您就不走运了。如果您遇到问题 2,或者您的
for
循环具有与问题中的结构不同的结构(例如program < "$1"
,或者具有许多不同程序的非常长的循环体),那么您可以lsof
通过查看打开的文件获得一些进度信息您当前的 shell 会话或其子进程。