io重定向运算符后的空格?

sta*_*abs 1 io-redirection shell-script

我注意到在编写 shell 脚本时,人们是否在 I/O 重定向操作符后放置一个空格存在很多不一致之处。例如:

foo >bar.txt
Run Code Online (Sandbox Code Playgroud)

会起作用,但这也会起作用:

foo > bar.txt
Run Code Online (Sandbox Code Playgroud)

....甚至这个:

foo       >             bar.txt
Run Code Online (Sandbox Code Playgroud)

事实上,即使是 Linux 文档项目页面也令人沮丧地不一致 -在一个地方和另一个地方使用2>&1(实际上在我的Bash终端中没有空格)> filename

我一直使用前者,因为后者对我来说就像 2 个不同的论点,但我想知道:两者之间有什么区别或推理吗?

>bar.txt> bar.txt什么的更便携?或者我应该在 1 种定义的情况下使用 1 种语法,而在另一种情况下使用另一种?

Ale*_*exP 5

  1. 字符<, >, &, 和|对 shell 来说是特殊的,当没有引用时,在任何位置都可以识别它们的特殊含义。

  2. 可移植重定向运算符是>>>>|>&<<<<<-<>。重定向操作符前面可以有一个数字,表示文件描述符;在这种情况下,号码和重定向操作符之间不能有空格;并且数字必须与前一个单词(如果有)隔开,并用一个或多个空格分隔。除此之外,重定向运算符周围未加引号的空格是可选的。

有关详细信息,请参阅The Open Group Base Specifications Issue 7,2018 版,Shell 和实用程序,第 2 章,“ Shell 命令语言”。