别名导致错误:意外令牌附近的语法错误`('

时间:2016-11-19 19:55:44

标签: bash alias

我正在尝试运行以下bash并收到错误:bash: syntax error near unexpected token `('

.bashrc中:

alias "ota"='/cygdrive/d/Program Files (x86)/Arduino/hardware/esp8266com/esp8266/tools/espota.py' 

我正在尝试运行以下命令:

ota --help

2 个答案:

答案 0 :(得分:4)

<强> TL;博士

  • 您需要引用别名命令,不仅仅是为了定义,而用于使用 as-is 。

  • 在您的情况下,最简单的解决方案是使用外部'...'引用与内部 "..."引用的组合(其他解决方案)存在;请注意,使用"..."进行内部引用意味着如果您的定义包含变量引用,则当别名使用时,它们会被展开:

alias ota='"/cygdrive/d/Program Files (x86)/Arduino/hardware/esp8266com/esp8266/tools/espota.py"'

定义别名时,有 两个引用(转义)上下文

  • 定义别名时引用。

  • 在命令的上下文中引用别名使用

您的别名定义中的引用允许您定义别名ota而不会出现语法错误:

您将别名ota定义为以下文字
/cygdrive/d/Program Files (x86)/Arduino/hardware/esp8266com/esp8266/tools/espota.py
即由于使用'...'(单引号)而导致RHS上字符串的文字内容。

但是,当您在命令ota --help使用此别名时,其定义将成为命令行的文字,未加引号部分,并且Bash会尝试执行以下已损坏的命令:

/cygdrive/d/Program Files (x86)/Arduino/hardware/esp8266com/esp8266/tools/espota.py --help

基于通常的shell expansions,此命令按如下方式处理:

  • /cygdrive/d/Program被解释为要执行的命令(第一个空格之前的所有内容),因为 word splitting 将命令行上的未加引号的标记拆分为空格的单词。 / p>

  • 因此,Files(x86)/Arduino/hardware/esp8266com/esp8266/tools/espota.py--help成为该命令的参数,但是:(和{{1当使用 unquoted 时,就像它们在这里一样,控制操作符到shell:它们用于创建子shell ,但这样做作为参数的一部分 语法无效,这就是您看到)的原因 (在找不到命令syntax error near unexpected token `('的运行时错误之前有机会启动)。

以上说明需要正确引用别名定义的嵌入式部分,如上图所示。
替代解决方案可以在下面找到。

引用替代方案:

/cygdrive/d/Program

改为使用功能

@ ruakh指出使用函数而不是别名会完全绕过两层引用的头痛:

# Using *outer double quotes with inner double quotes* would work here too,
# although if the definition contained variable references / command or 
# arithmetic substitutions, they'd be expanded at *definition* time.
alias ota="'...'"

# Using an *ANSI C-quoted string ($'...')* inside of which you can use
# \' to escape embedded single quotes (but you need to be aware of
# the meaning of other \-based escape sequences).
alias ota=$'\'...\''

# Using *character-individual quoting*, with \ preceding each shell 
# metacharacter (as in @sorontar's answer).
alias ota='/cygdrive/d/Program Files\ \(x86\)...'

答案 1 :(得分:0)

你需要反斜杠 - 逃避命令中的某些字符。特别是,您需要转义文件名中的空格以防止shell将文件名拆分为多个部分。您还需要转义(),它们是shell的元字符:

alias "nano"='/cygdrive/c/Program\ Files\ \(x86\)/Notepad++/notepad++.exe' 
alias "ota"='/cygdrive/d/Program\ Files\ \(x86\)/Arduino/hardware/esp8266com/esp8266/tools/espota.py'