如果星号 (*) 与字符串相连,bash 是否有自动转义星号的设置?

如果星号 (*) 与字符串相连,bash 是否有自动转义星号的设置?

我正在尝试调试为什么脚本没有在我的服务器上执行我想要的操作。在测试时,我发现了一个奇怪的现象。我有一个目录,大致如下所示:

bash-4.3# ls -l ./
共 0
-rw-r--r-- 1 root root 0 8月6日 05:46 db.local.php
-rw-r--r-- 1 root root 0 8月 6 05:46 global.php
-rw-r--r-- 1 root root 0 8月6日 05:46 local.php
-rw-r--r-- 1 root root 0 8月 6 05:46 someOther.global.php

看看运行这个命令,输出正是我所期望的:

bash-4.3# for i in ./*; do echo $i; done
./db.local.php
./global.php
./本地.php
./someOther.global.php

但是当我运行此命令时,输出没有任何意义。由于某种原因,星号被转义了:

bash-4.3# for i in ./*local.php; do echo $i; 完成
*本地.php

这发生在安装了 bash 4.3.30 的服务器上。我尝试在 bash 4.4 和 docker 容器 bash:4.3(即 bash 4.3.48)中本地重现相同的行为,但无法重现该问题。

有什么设置可以解决这个问题吗?除了 bug 之外还有什么可能吗?

我在发送之前刚刚想出了一个小补充:如果我在服务器上启动同一个 docker 容器,它的行为方式相同,这不太可能是设置问题,因为容器中没有安装任何来自主机系统的东西。不过,我不确定这可能是什么,有谁知道吗?

编辑:@grawity

bash-4.3$ for i in ./*; do 声明 -pi; 完成
声明——i=“./db.local.php”
声明——i=“./global.php”
声明——i=“./local.php”
声明——i="./someOther.global.php"
bash-4.3$ for i in ./*local.php; do 声明 -pi; 完成
声明——i=“./db.local.php”
声明——i=“./local.php”
bash-4.3$ for i in ./*; do echo $i; done
./db.local.php
./global.php
./本地.php
./someOther.global.php
bash-4.3$ for i in ./*local.php; do echo $i; 完成
./db.local.php
./本地.php

我不明白。声明后,它开始正常工作。它也可以正常处理具有其他结尾的其他文件。我不明白刚才发生了什么。

解决方案:感谢 Grawity 的帮助。我显然在上面的测试中犯了一些错误。看起来上面的行为是当没有文件满足星号补全时的标准行为。

答案1

解决方案:感谢 Grawity 的帮助。我显然在上面的测试中犯了一些错误。看起来上面的行为是当没有文件满足星号补全时的标准行为。

相关内容