如何使用管道对表达式执行 watch 命令?

如何使用管道对表达式执行 watch 命令?

我今天学到了精彩的 shuf 命令:

ls | shuf  

显示了工作目录的列表,但感谢每次我用另一个命令执行此管道命令表达式时的 shuf 。

所以我想,为什么不每秒重复这个表达,所以我尝试了

watch -n1 ls | shuf          (and got no output)
watch -n1 (ls | shuf)        (and got an error)
watch -n1 {ls | shuf}        (and got an error)

然后我把 ls | shuf 到它自己的文件中并用它创建一个脚本 foo 。

watch -n1 ./foo               (this times it worked)

是否可以将 watch 命令应用到管道命令表达式上,而无需将表达式制作成脚本文件?

答案1

watch 命令存在多种变体,其中一些变体生成 shell 来解释由传递给的参数串联而成的命令行watch(中间有空格字符)。在那些你可以做的事情:

watch 'ls | shuf'

与...一样:

watch ls '|' shuf

(那些watch实际运行的:"/bin/sh", ["sh", "-c", "ls | shuf"]并且非常危险,因为第二级解释可能会在未预料到时打开错误和安全问题的大门,procps-ng 的手表可以使用该-x选项避免这种行为)。

还有一些只执行第一个参数中给出名称的命令,并将所有参数作为参数。其中:

watch sh -c 'ls | shuf'

相关内容