Smi*_*ile 7 command-line bash redirect
program 2> error.log
program &> filename
program >> filename 2>&1
program 2>&1
Run Code Online (Sandbox Code Playgroud)
我能够弄清楚这些行的含义。
但是我不太明白我应该把空格放在哪里。我也担心放在哪里实际上并不重要。谢谢阅读。
是的,单词和重定向之间的间距无关紧要。这就是简短的回答。
细节在于shell(为简单起见,我们仅参考bash
)将某些字符和字符组视为“单词”和“元字符”。从 bash 4.3 手册:
元字符
不加引号时用于分隔单词的字符。以下之一:
Run Code Online (Sandbox Code Playgroud)| & ; ( ) < > space tab
和
字 被外壳视为单个单元的字符序列。也称为令牌。
所以当我们这样做时:
$ echo "hello world">/dev/null
Run Code Online (Sandbox Code Playgroud)
或者
$ echo "hello world" > /dev/null
Run Code Online (Sandbox Code Playgroud)
这仍然是 3 个单词(“hello world”可以被认为是单个 shell 单词,因为它被引用了),带有一个>
元字符和几个空格。Shell 会看到它,并首先执行重定向(因此它首先查找元字符),然后根据其标准行为运行命令。
但是,重定向的顺序很重要,尤其是当您使用2>&1
. 假设您想将 stderr 和 stdin 都发送到同一位置。这是一个错误的方法:
$ stat ./non-existent file 2>&1 > /dev/null
stat: cannot stat './non-existent': No such file or directory
stat: cannot stat 'file': No such file or directory
Run Code Online (Sandbox Code Playgroud)
您正在将文件描述符2
输出到与 相同的位置1
,这是您的终端,但它已经这样做了。这就是 stderr 出现的原因。
如果您stdout
先重定向,然后才更改2
指向的位置 - 那么它会起作用:
$ stat ./non-existent file > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2523 次 |
最近记录: |