关于流重定向的bash之谜:`cat x> y<`

时间:2014-02-04 15:06:08

标签: bash sh

我获得了以下bash谜语,但没有关于所用变量含义的其他信息。

cat x > y <

我假设x和y是文件。在我的bash中这不会执行(意外换行),所以我尝试了类似这样的东西

ls *.txt >0; cat file1.txt > file2.txt <0;

根据我的理解,这应该将file1.txt放到file2.txt然后放到ls *.txt的结果。它没有。它只放置file1.txt。并且不是被覆盖的情况,因为以下结果是相同的:

ls *.txt >0; cat file1.txt >> file2.txt <0;

我的问题是:

  1. 为什么忽略标准输入的重定向?

  2. 为什么<在最后是不正确的,我必须明确地放置<0?默认情况下不应该假设为零吗?

  3. 更新

    正如所指出的那样,我将>0误认为是>&0。这个问题仍然有效。

2 个答案:

答案 0 :(得分:3)

这里没有任何谜团。

cat x > y <

你说“没有关于所用变量含义的其他信息”;那是因为没有使用变量。 xy只是文件名。上面的命令是错误的,因为<需要文件名参数。

ls *.txt >0; cat file1.txt > file2.txt <0;

cat命令从stdin读取输入,如果它没有文件名参数(或者如果它被赋予-作为参数)。否则,它从命令行中命名的文件中读取 - 并忽略标准输入。

如果您输入

cat file1.txt

它不会尝试从键盘读取输入。出于完全相同的原因,如果您键入

cat file1.txt < 0

它不会尝试从文件0中读取。

  

为什么<在最后是不正确的,我必须明确地放置&lt; 0?默认情况下不应该假设为零吗?

在此上下文中,

0只是一个文件名。 0没有理由成为默认文件名。如果要从文件重定向输入,则需要命名文件;没有默认文件名。

您可能会感到困惑< 0,它使用0重定向来自名为<&0的文件的标准输入(该文件名没有什么特别之处),它将文件描述符中的标准输入重定向0,这是标准输入(因此<&0无效)。

答案 1 :(得分:2)

我对原来的谜语真的不知道。

但有一条关于“&gt; 0”的评论

这将重定向到名为“0”的文件。执行行

后,您会发现目录中有这样的文件
ls *.txt >0; cat file1.txt > file2.txt <0;

此文件将包含两个文本文件的文件名。