1

大家,我今天下午发现了这个奇怪的问题(也许是一个功能)。在我当前的工作目录中,有5个文件,分别是a,b,c,d,e

如果我发出以下命令

echo "a" | ls -l

我所期望的只是列出了文件 a 的详细信息。但从输出中,列出了文件 a、b、c、d、e 的详细信息。似乎管道之前的命令不起作用,例如,以下命令将完全输出,就好像只ls -l执行了一样。

echo "whatever_you_type" | ls -l

我很困惑,有人可以帮助解释这个问题吗?我知道我可以通过使用来解决这个问题xargs,比如echo "a" | xargs ls -l 但我想知道为什么。

4

2 回答 2

9

当您将某些内容通过管道传输到另一个进程时,它将被推送到其STDIN流中。由于 ls 不从标准输入读取,它只是忽略了这一点。你想要的是将参数传递给ls. 这可以通过使用这样的东西来实现:

my_file="a"
ls -l "$my_file"

或者,您可以使用可用于从标准输入构造命令行参数的xargs 。在您的情况下,您可以像这样使用它

echo "a" | xargs ls -l

它将ls -l [filename]为每个空格分隔的 stdin 输入字符串执行一个。

于 2012-05-09T09:03:00.687 回答
3

ls不接受来自stdin. xargs之所以有效,是因为它ls使用从其输入组装的参数调用一次或多次。实现您的示例的另一种方法是:

ls -l $(echo "a")

只要确保您没有任何带有空格的文件名。

于 2012-05-09T08:59:57.027 回答