Loading

如何在 alias 命令中使用单引号

问题

在 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

为什么 '"'"' 会被解释为 '?

首先看一下系统解释这段命令的过程:

  1. ' 结束命令开始的单引号到当前单引号的内容

  2. " 开始新的引用,并使用双引号,以保证接下来的引用会被直接解释成具体的值

  3. ' 代表被引用的值,也就是我们期望的单引号

  4. " 结束第 2 步的引用

  5. ' 开始新的引用,使用单引号

在这里,如果有两个连着的单引号引用,会被视为一个命令,比如:

$ echo 'abc''123'  
abc123

而使用了 '"'"' 的方式,则中间的单引号会被视为一个字符而不是起始的位置:

$ echo 'abc'"'"'123'
abc'123

参考

  1. bash - How to escape single quotes within single quoted strings - Stack Overflow
posted @ 2024-06-05 10:06  kingron  阅读(24)  评论(0编辑  收藏  举报