问题
在 Linux 中,alias
可以用来给需要输入很长一串字符的命令创建一个快捷方式,比如我们常见的 ll
命令实际上就等于 ls -l
:
alias ll='ls -l'
定义时,需要用单引号将命令包裹起来,如果命令本身就包含单引号,该怎么处理才能让系统正确识别呢?比如下面的命令:
alias rxvt='urxvt -fg '#111111' -bg '#111111''
你可能会想,换成双引号来包裹。但是如果用双引号,其中的内容会被转义解释成具体获得的值。而不是命令本身。而且,如果命令即包含双引号,也包含单引号,那么这种方式就行不通了。
解决方案
如果确实想在外层使用单引号,那么可以粘贴两种引号,比如:
alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
# ^^^^^ ^^^^^ ^^^^^ ^^^^
# 12345 12345 12345 1234
为什么 '"'"'
会被解释为 '
?
首先看一下系统解释这段命令的过程:
-
'
结束命令开始的单引号到当前单引号的内容 -
"
开始新的引用,并使用双引号,以保证接下来的引用会被直接解释成具体的值 -
'
代表被引用的值,也就是我们期望的单引号 -
"
结束第 2 步的引用 -
'
开始新的引用,使用单引号
在这里,如果有两个连着的单引号引用,会被视为一个命令,比如:
$ echo 'abc''123'
abc123
而使用了 '"'"'
的方式,则中间的单引号会被视为一个字符而不是起始的位置:
$ echo 'abc'"'"'123'
abc'123