program 2> error.log
program &> filename
program >> filename 2>&1
program 2>&1
我能够弄清楚这些线条的含义。
但是我不太明白我应该把空格放在哪里。我也担心在哪里放置空格实际上并不重要。谢谢阅读。
program 2> error.log
program &> filename
program >> filename 2>&1
program 2>&1
我能够弄清楚这些线条的含义。
但是我不太明白我应该把空格放在哪里。我也担心在哪里放置空格实际上并不重要。谢谢阅读。
是的,单词和重定向之间的间距无关紧要。这是简短的答案。
细节在于 shell(为简单起见,我们只参考
bash
)将某些字符和字符组视为“单词”和“元字符”。从 bash 4.3 手册:和
所以当我们这样做时:
或者
那仍然是 3 个单词(“hello world”可以被认为是一个 shell 单词,因为它被引用了),有一个
>
元字符和几个空格。Shell 将看到它,并首先执行重定向(因此它首先查找元字符),然后按照其标准行为运行命令。然而,重定向的顺序很重要,尤其是当您使用类似
2>&1
. 假设您想将 stderr 和 stdin 都发送到同一位置。这是一种错误的方法:您正在将文件描述符
2
输出到与终端相同的位置1
,但它已经这样做了。这就是 stderr 出现的原因。如果您
stdout
先重定向,然后再更改位置2
点 - 那么它将起作用:除了一些特殊情况外,间距无关紧要。
根据Bash 手册:
因此,例如,
echo test 2 > output.txt
将被解释为echo test 2 1> output.txt
,即将命令的标准输出重定向echo test 2
到文件 output.txt,这将创建包含文本“test 2”的文件。另一方面,
echo test 2> output.txt
会被解释为“将命令的stderr(文件描述符2)重定向echo test
到文件output.txt”,因为命令的stderr为空,所以会为空。此行为不限于数字 1 和 2。因此
echo test 5> output.txt
也会创建一个空文件。<(...)
,>(...)
左括号和 > 或 <之间不允许有空格。