外壳:GNU BASH
我已经使用了一段时间以下命令:
echo "$(fmt -w 50 < foo.txt)" > foo.txt
没有任何问题。但是,当我尝试:
fmt -w 50 < foo.txt > foo.txt
文件foo.txt变成空白文件。我认为这是由于重定向操作符和外壳程序解析的子外壳程序的优先级有关。
搜索GNU BASH手册并不是很成功。有人可以告诉我是否错过了手册中的内容吗?我真的很想了解这种行为的原因,以便我可以进一步使用它,并了解可能导致麻烦的任何情况。
从Bash手册中,3.7.1简单命令扩展:
当执行简单命令时,shell从左到右执行以下扩展,分配和重定向。
- 解析器已将标记为变量分配的单词(在命令名称之前的单词)和重定向保存下来,以供以后处理。
- 不是变量分配或重定向的单词将被扩展(请参阅Shell Expansions)。如果扩展后还剩下任何单词,则将第一个单词作为命令的名称,并将其余单词作为自变量。
- 重定向如上所述进行(请参阅重定向)。
=
分配给变量之前,每个变量分配中的后面的文本都要进行波浪号扩展,参数扩展,命令替换,算术扩展和引号删除。
命令替换是在(2)中进行的扩展之一,而重定向在(3)之后进行。这与子shell没有任何关系,这完全是由于shell执行工作的顺序所致。(fmt -w 50 < foo.txt) > foo.txt
也会导致空白文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句