以问号字符命名的 Bash 函数不再起作用

dan*_*lee 3 command-line bash scripts 13.04

在 Ubuntu 11.10 中,我有一个 bash 命令/别名/函数,如:

function ?() {
  xxx $1
}
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力。

现在在 Ubuntu 13.04 中它不再工作了。当我尝试使用一些参数执行命令时,我得到:

0:未找到命令

是什么改变了我不能再使用这个缩写?

PS当然可以更改别名,这只是出于好奇的问题。

gei*_*rha 5

?是一个 glob(模式,通配符),它将匹配由一个字符组成的文件名;它被当前目录中的匹配文件替换。如果当前目录中没有匹配的文件,?将保持不变,您的功能将被触发。这在bash参考手册中称为路径名扩展man bash文件名扩展

在这种情况下,你显然有一个文件名为0在当前目录中,所以? foo被改为0 foo由pathaname扩张,然后尝试运行一个名为命令0foo作为参数。如果您将该文件删除/重命名为长度超过一个字符的内容,您的函数应该开始工作。或者,您可以使用\?or"?"'?'代替,以避免将其视为 glob。

附带说明一下,?在函数名称中使用是未记录的,不推荐使用。仅记录了字母数字和下划线可以工作(与允许的变量名称相同)。