![使用命令输出作为 watch 命令中的参数](https://linux22.com/image/140732/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E4%BD%9C%E4%B8%BA%20watch%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0.png)
我有一块手表
jq -r '.' $(ls -t | head -1)"
目标是将“jq -r '.'”应用于目录中最近修改的文件。不幸的是,用于了解上次修改文件的命令是在启动监视时评估的,而不是在刷新时评估的。我应该如何编写它,以便在每次刷新时重新评估所有命令?
谢谢
答案1
如果您在单引号中传递命令,它将在每个监视周期展开,而不是在运行监视命令时展开,例如:
watch echo $(date)
watch 'echo $(date)'
第一个命令将一遍又一遍地打印原始日期,第二个命令将date
在每个周期运行并打印不同的日期。
这是因为您将文字字符串传递echo $(date)
给 watch 命令,该命令每个周期都会运行它并回显正确的日期。如果不使用引号,shell 将展开$(date)
并将其替换为 date 命令的输出,并将其传递给watch
,因此它将一遍又一遍地打印相同的输出。
答案2
您的命令的主要问题是当您执行
watch jq -r '.' "$(ls -t | head -1)"
...然后命令替换执行一次,作为评估命令的命令行参数的一部分watch
。
您必须在启动时停止当前 shell 评估命令替换,watch
以便watch
运行每次运行该命令时都会评估替换的命令。
你可以这样做
watch 'jq -r . "$(ls -t | head -1)"'
目录中最近修改的常规文件(可能是符号链接的)由shell*(.om[1])
中的文件名通配模式给出zsh
。括号限定了前面匹配名称的方式*
;点仅选择常规文件(可能是符号链接的),按上次修改的时间戳 ( )om
排序 ( ) ,并仅从生成的列表中挑选出第一个名称。o
m
[1]
因此,编写命令的另一种方法是
watch -x zsh -c 'jq . *(.om[1])'
在这里,给出命令的-x
原因而不是使用 运行它。watch
exec
sh -c