为什么 bash 禁止 shell 名为 `df` 的函数?

Why does bash prohibit a shell function named `df`?

我正在使用 GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

我的一个启动文件中有以下几行:

df() {
        printf "Hello, world!\n"
}

当获取该文件时,出现此错误:

-bash: sh/interactive.sh: line 109: syntax error near unexpected token `('
-bash: sh/interactive.sh: line 109: `df() {'

但是,如果我将函数名称从 df 更改为 direfanything_else,我不会收到错误消息。

我假设 df 不知何故是一个保留字,但是当我检查这个 list of reserved words in bash 时我找不到它。 (无论如何,我认为它不值得成为一个!)

那么,任何人都可以对此有所了解吗?为什么 bash 禁止我定义一个名为 df 的 shell 函数?

发生这种情况是因为您之前为此名称定义了别名。别名是简单的字符串前缀替换,因此会干扰函数定义:

$ alias foo='foo --bar'
$ foo() { echo "Hello"; }
bash: syntax error near unexpected token `('

这等同于(并且失败并出现相同的错误)

$ foo --bar() { echo "Hello"; }
bash: syntax error near unexpected token `('

要声明一个名称已被别名覆盖的函数,您可以使用 function 关键字:

$ alias foo='foo --bar'
$ function foo() { echo "Hello, "; }
$ foo
Hello, --bar