【问题标题】:Why does bash prohibit a shell function named `df`?为什么 bash 禁止名为 `df` 的 shell 函数?
【发布时间】:2020-01-28 05:36:11
【问题描述】:

我正在使用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 函数?

【问题讨论】:

  • @JoshLee:这是个问题,但在解析达到那个点之前,似乎还有其他问题。
  • 也就是说,我无法重现报告的问题。 ! 会导致问题,但命名函数 df 似乎可以正常工作。
  • 诊断:type -a df

标签: bash function reserved-words bash4


【解决方案1】:

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

$ 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, $1"; }
$ foo
Hello, --bar

【讨论】:

  • 我试图在另一个窗口中验证这一点,并意识到你是完全正确的!在转到 df-as-function 之前,我一直在使用 df-as-alias,果然在我遇到问题的 shell 窗口中有一个旧别名。很好的收获,谢谢!
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2016-12-27
  • 2014-04-23
  • 2015-10-07
  • 2010-12-09
相关资源
最近更新 更多