使用命令输出作为 watch 命令中的参数

使用命令输出作为 watch 命令中的参数

我有一块手表

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排序 ( ) ,并仅从生成的列表中挑选出第一个名称。om[1]

因此,编写命令的另一种方法是

watch -x zsh -c 'jq . *(.om[1])'

在这里,给出命令的-x原因而不是使用 运行它。watchexecsh -c

相关内容