我正在尝试运行以下bash并收到错误:bash: syntax error near unexpected token `('
。
.bashrc中:
alias "ota"='/cygdrive/d/Program Files (x86)/Arduino/hardware/esp8266com/esp8266/tools/espota.py'
我正在尝试运行以下命令:
ota --help
答案 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'