Bash 无法将echo命令的输出通过管道传输到ls

Bash 无法将echo命令的输出通过管道传输到ls,bash,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来解决这个问题,比如ec

各位,我发现了这个奇怪的问题,也许这是今天下午的一个特写。 在我当前的工作目录中,有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 但是我想知道为什么。

ls不从stdin获取输入。xargs之所以能够工作,是因为它使用从输入中组装的参数调用ls一次或多次。 实现示例的另一种方法是:

ls-l$echo a

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

ls不会从stdin获取输入。xargs之所以能够工作,是因为它使用从输入中组装的参数调用ls一次或多次。 实现示例的另一种方法是:

ls-l$echo a


只需确保没有任何文件名中有空格。

当您将某个文件导入另一个进程时,它将被推送到其STDIN流中。因为ls不从stdin读取数据,所以它忽略了这一点。您需要的是将参数传递到ls的命令行。这可以通过如下方式实现:

my_file="a"
ls -l "$my_file"
或者,您可以使用它从stdin输入构建命令行参数。在你的情况下,你可以像

echo "a" | xargs ls -l

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

当您将某个内容导入另一个进程时,它将被推送到其stdin流中。因为ls不从stdin读取数据,所以它忽略了这一点。您需要的是将参数传递到ls的命令行。这可以通过如下方式实现:

my_file="a"
ls -l "$my_file"
或者,您可以使用它从stdin输入构建命令行参数。在你的情况下,你可以像

echo "a" | xargs ls -l

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

也感谢您的解释。我对您提供的第二个解决方案感到更满意。对我来说似乎更自然。我从不使用xargs,因为总是有办法在命令行中获取所需的信息。只需使用变量。2如果文件名中有空格或特殊字符的可能性很小,您应该像往常一样引用ls-l$echo a这样的输出。一般来说,在shell脚本中,参数的引号不能太少。@Holger-我同意在一般情况下,子shell是不必要的,但我假设OP考虑了一个更复杂的场景。也谢谢你的解释。我对你提供的第二个解决方案感到更满意。对我来说似乎更自然。我从不使用xargs,因为总是有办法在命令行中获取所需的信息。只需使用变量。2如果文件名中有空格或特殊字符的可能性很小,您应该像往常一样引用ls-l$echo a这样的输出。一般来说,在shell脚本中,围绕参数的引号不能太少。@Holger-我同意在这个小例子中,子shell是不必要的,但我假设OP考虑了一个更复杂的场景。