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

时间:2015-03-02 10:53:45

标签: linux bash shell

我创建了一个名为" com"的文件。内容

  

章*

然后我尝试将以下命令运行到bash:

  

ls< COM

据我了解,shell将接受输入  章节* 来自文件" com"并将它放在ls旁边,结果是这样的:

  

ls Chapter *

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

以下命令

也会发生这种情况
  

cat< list_of_filenames_to_give_input_to_cat_command

让list_of_filenames_to_give_input_to_cat_command'包含以下内容:

  

quicksort.c

     

mergesort.c

     

radixsort.c

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

  

quicksort.c

     

mergesort.c

     

radixsort.c

任何帮助表示赞赏!感谢。

4 个答案:

答案 0 :(得分:1)

试试这个:

ls $(<com)
与许多其他标准的un * x命令一样,

/bin/ls使用命令行参数,而不是 STDIN

你可以写:

ls $(cat com)

允许使用语法:$(&lt; filename)并且比$(cat ...)或cat com更快地工作,因为它是内置的(没有分叉)。

使用STDIN传递参数

执行此操作有一个命令xargs

xargs /bin/ls <com

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

echo $(<com) | xargs ls

答案 1 :(得分:1)

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

你可以这样做:

ls -l $(cat com)

答案 2 :(得分:1)

  

据我所知,shell将从文件&#34; com&#34;中获取输入章*。并将它放在ls旁边

不,那不是它的意思。

ls < com

相当于

cat com | ls

由于ls没有读取它的标准输入,因此忽略来自com的数据。正如另一个答案所提到的那样,通过使用:

,实现了您所描述的行为
ls $(<com)

答案 3 :(得分:0)

另一种方法:

ls `cat com`

cat `cat list_of_filenames_to_give_input_to_cat_command`
  

在主命令之前shell会评估(执行)在反引号之间键入的所有内容,并且该命令将使用该执行的输出,就像您在命令中的那个位置键入该输出一样线。

     

- 从rozcietrzewiacz回答What does ` (backquote/backtick) mean in bash?

更新

说明您未获得预期结果的原因如下:

  

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

     

除上述cp外,所有上述命令都有共同之处   他们从不打开任何文件阅读的事实。 如果命令永远不会   从任何文件中读取任何数据,它无法从标准输入读取任何数据。

     

...

     

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

     

- 来自Unix Shell I/O Redirection