单引号是不是将反斜杠视为 bash 脚本中的特殊字符?
Posted
技术标签:
【中文标题】单引号是不是将反斜杠视为 bash 脚本中的特殊字符?【英文标题】:Do single quotes treat backslashes as special in bash scripting?单引号是否将反斜杠视为 bash 脚本中的特殊字符? 【发布时间】:2015-09-24 05:48:49 【问题描述】:从我读过的here 来看,它说“在单引号内,除了' 之外的每个特殊字符都会按字面意思解释”。所以,我认为反斜杠(“\”)也会被逐字解释。
但是,当我尝试在别名中使用它时,它仍然会被解释为特殊字符:
alias somefolder='cd /Some\ path/with\ spaces/'
...仍然有效吗?
但事实并非如此:
alias somefolder='cd /Some path/with spaces/'
这让我感到惊讶,因为我认为单引号的全部意义应该是为了懒惰,即当您不使用 $
扩展任何变量时(因为这需要双引号)。
我真的怀疑 tldp 来源是错误的,那么有没有更好的方法来解释这一点?谢谢。
【问题讨论】:
与引号无关。它与别名扩展有关,这是字符串 value 的字面意思。只在路径周围加上引号。 ... 这是应该使用 shell 函数而不是别名的众多原因之一。 mywiki.wooledge.org/BashFAQ/080 still....我对此感到更加困惑:alias somefolder='cd '/Some path/with spaces/''
不起作用,正如我在问题中所说的那样。但是,从命令行,cd '/Some path/with spaces/'
是否工作?
...所以如果别名扩展去掉了单引号,那么为什么在 cd
之后的路径名周围加上另一组单引号不起作用?
【参考方案1】:
这是因为别名会被shell扩展,在这个过程中单引号会被去掉。因此,在别名扩展之后,您将拥有
cd /Some path/with spaces/
如你所说,剩下的会失败。
但是当您使用\
转义空格时,在扩展别名(并删除单引号)后,shell 将执行以下操作:
cd /Some\ path/with\ spaces/
这将按预期工作。
【讨论】:
更准确地说,在创建别名时引号已经被删除。 感谢您的回答。但是,这仍然有些奇怪,请参阅我对我的问题的评论。谢谢。【参考方案2】:啊,但是您正在构建的别名正在将您的单引号 var 放到 cd
命令中,这让您感到窒息
cd /Some path/with spaces/
因为cd
不知道如何处理空间,而不是你的 bash。
当您将\
添加到字符串时,如
'cd /Some\ path/with\ spaces/'
解释\
的是cd
,而不是仅仅是一个信使的bash。
【讨论】:
以上是关于单引号是不是将反斜杠视为 bash 脚本中的特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章