echo 操作包含一些不应包含的文本

echo 操作包含一些不应包含的文本

在带有 Composer 的 WSL Ubuntu 16.04 (Xenial) 上,我执行了:

echo 2 * 3 > 5 is a valid inequality 

它生成了一个名为 的文件5,其内容为:

2composer-setup.php 3 是有效的不等式

我不知道为什么这也echo包括文本;composer-setup.php它应该包含除了 5(文件名)之外的从左到右的所有内容,因为echo可以使用单个文本流作为重定向的文件名(据我所知,不允许有空格,因此得名5)。

为什么出现composer-setup.php在2和3之间?

答案1

您执行的命令行中包含两个 shell 特殊字符:*>。你看到了什么>;是*一个通配符/通配符,它​​选取当前目录中的每1 个文件。您的当前目录中有一个名为composer-setup.php 的文件。

引用你的命令行;如果文本中没有单引号,则单引号有效:

echo '2 * 3 > 5 is a valid inequality'

1:每个不以句点开头的文件(或目录、套接字等),除非您专门设置了 shell 选项(例如 dotglob)使能够点文件通配。

答案2

这里发生了两件事......

首先,shell 看到该*字符并将其替换为当前目录中的文件列表。这称为“通配”

此外,它> 5被视为重定向命令。

所以

echo 2 * 3 > 5 is a valid inequality 

被解析为

echo 2 * 3 is a valid inequality > 5

这会创建一个名为“5”的文件,其内容为“2”当前文件列表3 是有效的不等式”。

为了防止这种情况发生,我们需要使用引号

echo '2 * 3 > 5 is a valid inequality'

'...'会阻止 shell 解释特殊字符并显示您输入的字符串。

相关内容