我可以在 watch 命令中重新加载变量吗?

我可以在 watch 命令中重新加载变量吗?

我的部分工作涉及一些数据处理。其中一个任务是“展平”一组目录(我们将其称为目录暂时),并将它们复制到名为 DirFlat 的新位置。

这可能需要很长时间(30 分钟 -> 2-3 小时)!我希望能够观察进度,所以我用来find Dir -type f|wc -l获取文件数量(让我们称之为$Filenum,然后我运行我编写的一个非常短的命令(从我的笔记本上重新输入,可能复制错误,我希望你能明白要点):

echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)

但是,如果我运行watch -n 100 "!!"它,它会获取回显的输出,并继续打印该输出(即使日期也不会改变)。

我可以用它来刷新变量/重新运行 BASH 中内部变量的赋值吗?希望这能帮助我自动化一些任务。

答案1

对比:

$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013

$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)

您所做的就是运行echo "($ls DirFlat |wc -l)*100/$FileNum"|bcdate,将每个命令的输出替换为 shell 命令watch -n 100 "echo $(…) % $(…)",然后运行它。您需要防止在父 shell 中扩展该命令,而是将其作为字符串传递给watch它以使其运行。这是一个简单的问题,只需在命令周围使用单引号而不是双引号即可。

答案2

或者,您可以将其包装到 shell 循环中:

while sleep 100; do
    (... your stuff ...)
    if [ (... process has finished ...) ]; then
        (... beep or get operator's attention otherwise ...)
        break
    fi
done

答案3

您必须将其放入 shell 脚本中,然后让 watch 调用该脚本。

答案4

使用您想要运行的命令和 sleep 命令的 while 循环也将允许您像 watch 命令一样重复运行 linux 命令。不过,在这种特定情况下,@peterph 的答案更好,因为它有一个终止条件。这个较短的响应仅回答了重新运行同一进程时如何刷新的问题。

while true; do echo $(date +"%T"); sleep 1; done

睡眠后的数字以秒为单位。

相关内容