Bash Input重定向为命令提供标准输入,而不是参数/文件名



我创建了一个名为"com";带有内容

第*章

然后我尝试在bash中运行以下命令:

ls<com

据我所知,shell将接受输入第章*从文件";com";然后把它放在ls旁边,结果是这样的:

ls第*章

现在,这个命令应该列出以"Chapter"开头的所有文件,但它会打印当前目录中的所有文件。

以下命令也会发生这种情况

cat<list_of_filenames_to_give_input_to_cat_command

让"list_of_filenames_to_give_input_to_cat_command"包含以下内容:

quicksort.c

mergesor.c

radixsort.c

这应该打印上述每个文件的内容。相反,它只打印文件名如下:

quicksort.c

mergesor.c

radixsort.c

感谢您的帮助!谢谢

ls不从标准输入读取参数,而是从命令行读取参数。

你可以简单地做:

ls-l$(cat-com)

只需尝试以下操作:

ls $(<com)

与许多其他标准un*x命令一样,/bin/ls使用命令行参数,而不是STDIN

你可以写:

ls $(cat com)

bash允许语法:$(<filename),并且工作速度比$(cat…)或cat com快,因为它是内置的(没有fork)。

使用STDIN传递参数

有一个命令xargs用于执行此操作:

xargs /bin/ls <com

但这不适用于通配符(*)。

echo $(<com) | xargs ls

据我所知,shell将从文件"com"中获取输入Chapter*,并将其放在ls旁边

不,这不是它的意思。

ls < com

相当于

cat com | ls

由于ls不读取其标准输入,因此忽略来自com的数据。正如另一个答案所提到的,你所描述的行为是通过使用来实现的

ls $(<com)

另一种方法:

ls `cat com`

和:

cat `cat list_of_filenames_to_give_input_to_cat_command`

在backtick之间键入的所有内容都由shell在主命令之前进行评估(执行),该执行的输出由该命令使用,就像在命令行中的那个位置键入输出一样。

-从rozcietrzewiacz对bash中"(backquote/backtick)"的回答?

更新

为什么你没有得到预期结果的解释如下:

并非所有命令都从标准输入读取常见Unix的示例从不从标准输入读取的命令:ls, cp, mv, date, who, pwd, echo, cd

除上述cp外,上述所有命令都有共同点他们从不打开任何文件进行阅读如果命令从未从任何文件读取任何数据,它不能从标准输入读取任何数据

如果(且仅当!)命令从标准输入读取,则重定向标准输入将导致程序从您附加的任何内容中读取标准输入

-来自Unix外壳I/O重定向

最新更新