shell 通配符没有按我预期的方式工作

shell 通配符没有按我预期的方式工作

我几年前退休了,工作的时候用的是 Linux、Solaris 和 SunOS。我记得,如果我

mkdir x
cd x
echo hello > x*

shell 会以类似“x*: no match”的方式做出响应,并且不会执行 echo 命令。但现在,当我在 Debian Linux 上执行此操作时,它会创建文件 x*。我尝试使用 /bin/bash 和 /bin/sh 执行此操作;结果相同。

然后我偶然发现了 failglob 和 shopt。显然,debian linux 上没有设置 failglob,所以我把它放在我的 .bashrc 文件中:

shopt -s failglob

取消设置 failglob 是正常行为吗?这是 Debian 或 Linux 独有的吗?

答案1

POSIX状态下列:

如果模式与任何现有文件名或路径名不匹配,则模式字符串应保持不变。

因此,此行为符合 POSIX 规范,因此是 sh 模式下的默认行为。可能是您或您的发行版在过去为交互使用而对 shell 进行了不同的配置(或者可能是 bash 曾经具有非 POSIX 默认值)。dash 是 Debian 的默认设置,似乎从未出现过此行为,尽管可能是您在使用它时/bin/shbash 是默认设置。/bin/sh

还要注意,此行为是 zsh 模式(选项nomatch)下 zsh 的默认行为,但在 sh 和 ksh 模式下被禁用(因为它不符合 POSIX 标准)。

相关内容