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 存储到“文件”中并使用它?

4

2 回答 2

5

您需要在xargs那里使用,因为rm需要删除参数,它不会从STDIN(通常是管道)中读取。

echo test | xargs rm

第一个有效,因为反引号用于替换,很像${}但不那么容易。:)

或者,您可以使用find.

find . -name test -exec rm -f '{}' \;
于 2013-02-20T00:54:18.687 回答
1

在第一种情况下,echo test(字符串test)的结果作为命令行参数提供给rm. 第二,字符串test被传送到进程的stdin文件描述符rm。这是两个非常不同的东西。由于 rm 不从标准输入读取,它永远不会看到test.

于 2013-02-20T00:54:09.743 回答