如果我发出以下命令
echo "a" | ls -l
我的期望是只列出文件a的详细信息。
但是从输出中,列出了文件a,b,c,d,e的详细信息。
似乎管道前的命令不起作用,例如,以下命令将完全输出,就像只执行ls -l
一样。
echo "whatever_you_type" | ls -l
我很困惑,任何人都可以帮忙解释一下这个问题吗?
我知道我可以使用xargs
解决此问题,例如echo "a" | xargs ls -l
但我想知道原因。
答案 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")
请确保您没有任何包含空格的文件名。