我正在尝试查看/tmp/
目录中的文件数。为此,我认为此命令将起作用:
watch sh -c 'ls /tmp/|wc -l'
但这似乎ls
没有任何论据就可以工作。也就是说,我在~
,在那里我得到的文件数量而不是/tmp/
。我找到了一种解决方法,该方法似乎可行:
watch sh -c 'ls\ /tmp/|wc -l'
但是,为什么我要逃避之间的空间ls
和/tmp/
?命令是如何转换的,watch
以便将ls
输出馈送到wc
,但/tmp/
不作为参数传递给ls
?
可以通过strace
以下方式看到差异:
$ strace -ff -o bq watch sh -c 'ls\ /tmp/|wc -l'
^C
$ strace -ff -o nobq watch sh -c 'ls /tmp/|wc -l'
^C
$ grep exec bq* | grep sh
bq.29218:execve("/usr/bin/watch", ["watch", "sh", "-c", "ls\\ /tmp/|wc -l"], [/* 54 vars */]) = 0
bq.29219:execve("/bin/sh", ["sh", "-c", "sh -c ls\\ /tmp/|wc -l"], [/* 56 vars */]) = 0
bq.29220:execve("/bin/sh", ["sh", "-c", "ls /tmp/"], [/* 56 vars */]) = 0
$ grep exec nobq* | grep sh
nobq.29227:execve("/usr/bin/watch", ["watch", "sh", "-c", "ls /tmp/|wc -l"], [/* 54 vars */]) = 0
nobq.29228:execve("/bin/sh", ["sh", "-c", "sh -c ls /tmp/|wc -l"], [/* 56 vars */]) = 0
nobq.29229:execve("/bin/sh", ["sh", "-c", "ls", "/tmp/"], [/* 56 vars */]) = 0
在反引号的情况下,ls /tmp
作为单个参数传递给-c
to sh
,该参数按预期运行。如果没有该反引号,则该命令将在watch
运行时进行单词拆分,sh
从而依次运行提供的sh
,因此仅ls
将其作为参数传递给-c
,这意味着子-subsh
将仅运行裸ls
命令,并列出当前工作的内容目录。
那么,为什么会并发症sh -c ...
呢?为什么不简单地运行watch 'ls /tmp|wc -l'
呢?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句