无法将echo命令的输出传递给ls

时间:2012-05-09 08:53:15

标签: bash

大家,我今天下午发现了这个奇怪的问题(也许是一个特色)。 在我当前的工作目录中,有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 但我想知道原因。

2 个答案:

答案 0 :(得分:6)

当您将某些内容传递到另一个进程时,它将被推送到其STDIN流中。由于ls没有从stdin读取,它只是忽略了这一点。你想要的是参数传递给ls的命令行。这可以通过使用类似的东西来实现:

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

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

一样使用它
echo "a" | xargs ls -l

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

答案 1 :(得分:3)

ls不接受stdin的输入。 xargs有效,因为它使用从其输入汇编的参数调用ls一次或多次。 实现您的示例的另一种方法是:

ls -l $(echo "a")

请确保您没有任何包含空格的文件名。