BASH:语法错误附近意外令牌'done'附带名为'do'的别名

时间:2014-04-09 16:51:21

标签: linux bash

这个问题似乎经常被问到,但对我的问题仍然没有令人满意的答案。因此,我希望你能帮助我。

在Ubuntu LTE 13.04下打开终端时出现以下错误:

  

意外令牌done' bash: /usr/share/bash-completion/bash_completion: line 225:附近的语法错误'

我查看了具体的' bash_completion' - 似乎很好。 此外,我将其缩小到我的.bashrc文件中的以下命令。

alias do='rsync -r -e ssh --exclude='file.py' user@server.xxx.de:/path/to/folder /do/here'

虽然以下工作完全没有引起任何例外:

alias up='rsync -r -e ssh --exclude='file.py' /path/to/folder user@seerver.xxx.de:/do/here'

我检查了它是否因--exclude标志而发生,但它没有。似乎命令有问题。虽然这两个命令完全完成他们的工作。只有第一个引发错误。 有什么想法吗?

3 个答案:

答案 0 :(得分:7)

在bash中,do是一个保留字。它正在寻找do ... done块。只需将别名命名为别的。

答案 1 :(得分:3)

do是一个shell关键字。您不能将其用作别名而不会导致错误。

除此之外 - 考虑使用函数而不是别名;它们提供了更多的控制。这个别名可能会被重写为:

do_sync() {
  rsync -r -e ssh --exclude='file.py' \
    user@server.xxx.de:/path/to/folder \
    /do/here \
    "$@"
}

使用函数代替别名可以让你做条件逻辑,在尾部以外的位置插入参数,并显着简化引用(对于你的别名来说,几乎可以肯定的是,它并没有做你想要的,因为您在别名文本和别名文本中使用相同的引号类型而没有转义)。

答案 2 :(得分:0)

就像我在另一个线程中所说的那样,我错误地给local加上了别名,这也赋予了bash_completion脚本相同的corrupted behavior…… 因此,只是提醒您避免给禁止使用的单词加上别名,例如local do done等。 希望能帮助到你 :) 干杯