shell 吃 '?' 字符

shell 吃 '?' 字符

这是一个非常简单的问题,我确信有人在某个地方问过这个问题,但我找不到它。我的 shell 并不是故意设置的,它似乎会吃掉任何涉及问号的单词:

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ echo a ? = =?
a =

$ not-a-command? echo a
a

$ (?) echo a
a

如果很重要,请注意任何包含问号的单词似乎完全悄无声息地消失了,以至于她的 shell 甚至从未注意到调用以未指定有效可执行文件的单词开头,即使问号不在开头。

答案1

您可能nullglob启用了 shell 选项;如果通配符不匹配任何内容,这会导致包含通配符(*或)的任何单词被删除。?因此,如果您所在的文件夹不包含任何具有单字符名称的文件、文件夹等,?则不会扩展为任何内容,而是会被删除;同样,not-a-command?不太可能匹配任何内容,而是将被删除。

要检查是否是这种情况,请运行

shopt nullglob

要取消激活该选项,请运行

shopt -u nullglob

答案2

它就像*,但它代表单个字符

例如显示三字符根目录:

$ ls -d /???
/bin  /dev  /etc  /lib  /mnt  /opt  /run  /sys  /tmp  /usr  /var

请注意,/home未显示,因为它不匹配

使用[?]or\?或 将字符串括在引号 ("foo?"'bar?')中

相关内容