在带有 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 解释特殊字符并显示您输入的字符串。