我获得了以下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;
我的问题是:
为什么忽略标准输入的重定向?
为什么<
在最后是不正确的,我必须明确地放置<0
?默认情况下不应该假设为零吗?
正如所指出的那样,我将>0
误认为是>&0
。这个问题仍然有效。
答案 0 :(得分:3)
这里没有任何谜团。
cat x > y <
你说“没有关于所用变量含义的其他信息”;那是因为没有使用变量。 x
和y
只是文件名。上面的命令是错误的,因为<
需要文件名参数。
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;
此文件将包含两个文本文件的文件名。