带有单引号和双引号的 bash 别名命令
Posted
技术标签:
【中文标题】带有单引号和双引号的 bash 别名命令【英文标题】:bash alias command with both single and double quotes 【发布时间】:2013-12-05 08:07:09 【问题描述】:我有这个命令可以执行我想要的操作,但我无法在我的 .bashrc 中为其添加别名(请注意,它同时使用单引号和双引号):
svn status | awk '$1 =="M"print $2;'
我试过了:
alias xx="svn status | awk '$1 ==\"M\"print $2;'"
还有其他一些没有运气的常识组合..我知道 bash 对引号非常挑剔.. 那么别名的正确方法是什么,为什么?谢谢
【问题讨论】:
【参考方案1】:你只需要正确地转义它。
alias xxx="svn status | awk '\$1 ==\"M\"print \$2;'"
【讨论】:
所以我没有逃避 $.. 不知道! 不错!我也不知道我必须逃避“$”! 很好的答案,但也提醒人们犯错是多么容易。在我处理的情况下,已经有转义字符,这造成了巨大的混乱。 EJK 下面的回答对我来说更有用,一个函数对许多人来说可能是一个更干净的选择:) @jeremyclarke 我不同意,逃避很难,如果可以的话,避免它。 `是否需要转义?【参考方案2】:这里有一个不使用别名就能完成同样事情的东西。将其放入 .bashrc 中的函数中:
xx()
svn status | awk '$1 =="M"print $2;'
这样您就不必担心引号是否正确。这使用与命令行完全相同的语法。
【讨论】:
+1,但有一个小问题——function
关键字与 POSIX 不必要地不兼容。别管它:xx() ...
这个比较简单,我喜欢,但是另一个更准确地回答了这个问题..
@pragmatic_programmer 这是一个公平的解释。就个人而言,我仍然认为这个答案是更好的答案,尽管在字面意义上没有响应——至少有 50% 的时间我们在 irc.freenode.org 的#bash
中收到关于别名的问题,答案是“使用代替功能";别名只能做前缀扩展,例如,如果您想在参数上进行分支,这将无用。
有时候,对确切问题的字面答案更受欢迎,但大多数时候,像这样的答案更有帮助,因为它 1) 以简单的方式解决了最初的问题理解方式和 2) 为提问者提供了一个新工具,用于他们众所周知的工具带。
我必须同意,这比尝试使用别名要好得多【参考方案3】:
由于Bash 2.04,除了使用函数或转义the way @ffledgling 之外,还有第三种(更简单的)方法:使用字符串文字语法(here is an excellent answer)。
因此,例如,如果您想创建 this onliner 的别名,它最终会是:
alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"print $1" --revision "$3\' | xargs -rn3 snap remove'
所以你只需要在字符串前面添加$
并转义单引号。
这会带来a shellcheck warning,您可能可以安全地禁用with # shellcheck disable=SC2139
。
【讨论】:
【参考方案4】:您可以还原双引号和单引号,以便双引号在单引号之外。
例如,这不起作用:
alias docker-table='docker ps --format "table .ID\t.Image\t.Status"'
但这有效:
alias docker-table="docker ps --format 'table .ID\t.Image\t.Status'"
当您检查实际解释的别名时,您可以看到内部引号实际上被转义了。
$ alias docker-table
alias docker-table='docker ps --format '\''table .ID\t.Image\t.Status'\'''
【讨论】:
以上是关于带有单引号和双引号的 bash 别名命令的主要内容,如果未能解决你的问题,请参考以下文章