Bash 无法将echo命令的输出通过管道传输到ls
各位,我发现了这个奇怪的问题,也许这是今天下午的一个特写。 在我当前的工作目录中,有5个文件,即a、b、c、d、e 如果我发出以下命令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
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考虑了一个更复杂的场景。