理解Linux参数和管道

3

我正在尝试使用sh(Bourne Shell)编写一些脚本。我一直遇到这个困惑。针对以下内容:

1. rm `echo test`
2. echo test | rm

我知道反引号可以先运行命令,但是在 #2 的管道输入中,为什么 `rm` 命令没有将 `test` 作为一个参数输入?我是否对管道的理解存在问题?我认为它只是简单地将一个命令的输出作为另一个命令的输入。
还有...可能与我的管道困惑有关。
dir=/blah/blar/blar
files=`ls ${dir} -rt`
count=`wc -l $files` # doesn't work, in fact it's running it along with each file that exists
count2=`$files | wc -l` # doesn't work

为什么我不能将"ls"存储到"files"中并使用它?


关于你的更新,请尝试列出文件,然后将其导向到wc -l - alex
我只是想知道为什么我不能将ls存储到一个变量中并使用它。 - dtc
2个回答

5

在那种情况下,您需要使用xargs,因为rm需要参数来删除,它不会从STDIN中读取(这通常是管道传递的内容)。

echo test | xargs rm

第一种方法可行是因为反引号用于替换,类似于${}但不如后者易用。 :)
或者,你可以使用find
find . -name test -exec rm -f '{}' \;

1
谢谢您的快速回复。能否再麻烦您一个问题?我现在就要发布它。 - dtc
@dtc 当然,请提出新问题并将其链接给我。 - alex
所以这可能是 wc 处理输入的一种方式,我可能只是匆忙提出问题而不是自己调查,但我在同一个问题中发布了它。 - dtc

1
在第一个案例中,echo test的结果(字符串test)作为命令行参数提供给了rm。而在第二个案例中,字符串test管道传输到了rm进程的stdin文件描述符。这两种方式是非常不同的。由于rm不从标准输入读取,它永远也看不见test

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接