bash"echo"包括中间创建文件中的">" - 请解释

sec*_*ded 8 linux bash shell io-redirection

我写的时候:

echo 2*3>5 is a valid inequality
Run Code Online (Sandbox Code Playgroud)

在我的bash终端中,5在我的目录中创建了一个名为的新文件,其中包含:

2*3 is a valid inequality
Run Code Online (Sandbox Code Playgroud)

我想知道这里到底发生了什么,为什么我得到这个输出?我相信我很熟悉Linux!谢谢

cxw*_*cxw 12

在bash中,重定向可以出现在行中的任何地方(但你不应该这样做!---请参阅bash-hackers教程).Bash将>5重定向作为重定向,创建输出文件5,然后处理其余参数.因此,echo 2*3 is a valid inequality会发生这种情况,它会为您提供输出文件中显示的输出5.

你可能想要的是什么

echo "2*3>5 is a valid inequality"
Run Code Online (Sandbox Code Playgroud)

要么

echo '2*3>5 is a valid inequality'
Run Code Online (Sandbox Code Playgroud)

(使用单引号),其中任何一个都将为您提供在命令行中指定为打印输出的消息.不同之处在于,""变量(例如$foo)将被填充,但不会填入''.

编辑:bash man页面说明了

重定向运算符可以在简单命令之前或出现在任何地方,也可以跟随命令.重定向按其出现的顺序从左到右处理.

  • 所以,如果我理解正确,我把`> filename`放在哪里都没关系!也就是说以下内容:`命令一些文本>文件名一些文本`将把命令的输出放在这里的`some text some text`,在一个名为filename的文件中,对吧? (2认同)

hee*_*ayl 7

bash首先进行输出重定向,即先>5完成,然后5创建一个名为的文件(如果已经存在则截断).结果文件描述符对于echo命令的运行时保持打开状态.

然后剩下的部分2*3 is a valid inequality作为参数运行echo,标准输出5最终保存在(已打开)文件中.

要将整个字符串作为输出,请使用单引号或双引号:

echo '2*3>5 is a valid inequality'
Run Code Online (Sandbox Code Playgroud)