假设您有一个Bash,alias
例如:
alias rxvt='urxvt'
效果很好。
然而:
alias rxvt='urxvt -fg '#111111' -bg '#111111''
将无法工作,也不会:
alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''
那么,一旦转义了引号,如何最终匹配字符串中的开始和结束引号?
alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
看起来很笨拙,尽管如果允许您将它们串联起来,它将表示相同的字符串。
如果您确实想在最外层使用单引号,请记住您可以同时粘贴两种引号。例:
alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
# ^^^^^ ^^^^^ ^^^^^ ^^^^
# 12345 12345 12345 1234
解释如何'"'"'
解释为'
:
'
结束使用单引号的第一引号。"
使用双引号开始第二个引号。'
带引号的字符。"
使用双引号结束第二个引号。'
使用单引号开始第三引号。如果您没有在(1)和(2)之间或(4)和(5)之间放置任何空格,则Shell会将该字符串解释为一个长字。
alias splitpath='echo $PATH | awk -F : '"'"'{print "PATH is set to"} {for (i=1;i<=NF;i++) {print "["i"]",$i}}'"'"
当别名字符串中同时包含单引号和双引号时,它将起作用!我的解释:bash隐式连接了用不同引号引起来的字符串表达式。
为我工作,双转义单引号的示例:
alias serve_this_dir='ruby -rrack -e "include Rack;Handler::Thin.run Builder.new{run Directory.new'"'"''"'"'}"'
当然不是最易读的解决方案。它在确实不需要单引号的地方过度使用了单引号。
我认为,
'\''
在大多数情况下,它比更具可读性'"'"'
。实际上,前者在单引号字符串中几乎总是明显不同,因此仅是将它在语义上映射到“它是转义的引号”的意思,就像\"
在双引号字符串中那样。后者混为一谈,并在许多情况下需要仔细检查以正确区分。