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

Pur*_*ret 7 shell watch quoting variable-substitution

我的部分工作涉及一些数据处理。其中一项任务是“展平”一组目录(我们现在将其称为Dir),并将它们复制到一个名为 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 中内部变量的分配吗?希望这将帮助我自动化我的一些任务。

Gil*_*il' 9

对比:

$ 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)
Run Code Online (Sandbox Code Playgroud)

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