我注意到,在编写 shell 脚本时,人们在 I/O 重定向运算符后面是否放置空格方面存在很多不一致之处。例如:
foo >bar.txt
会起作用,但这样也会起作用:
foo > bar.txt
....甚至这个:
foo > bar.txt
事实上,即使Linux 文档项目页面令人沮丧地不一致 - 使用2>&1
(这实际上在我的重击终端(带空格)在一个地方和> filename
另一个地方!
我一直使用前者,因为后者对我来说就像是两种不同的论点,但我想知道:两者之间有什么区别或推理吗?
比什么>bar.txt
更便携?> bar.txt
或者我应该在一种定义的情况下使用一种语法,而在另一种情况下使用另一种语法?
答案1
字符
<
、>
、&
和|
对于 shell 来说是特殊的,并且在不加引号时在任何位置都以其特殊含义被识别。可移植重定向运算符是
>
,>>
,>|
,>&
,<
,<<
,<<-
,<>
。重定向操作符前面可以有一个指示文件描述符的数字;在这种情况下,号码和重定向运算符之间不能有空格;并且数字必须与前一个单词(如果有)隔开一个或多个空格。除此之外,重定向运算符周围未加引号的空格是可选的。
看The Open Group 基本规范第 7 期,2018年版,壳牌和公用事业公司, 第2章, ”外壳命令语言”了解详情。