bash别名命令,带有单引号和双引号


81

我有此命令可以执行我想要的操作,但无法在我的.bashrc中使用别名(请注意,它同时使用单引号和双引号):

svn status | awk '$1 =="M"{print $2;}'

我试过了:

alias xx="svn status | awk '$1 ==\"M\"{print $2;}'"

以及其他一些没有运气的常识组合。.我知道bash带有引号非常挑剔。谢谢

Answers:


108

您只需要正确地转义即可。

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"

16
所以我没有逃脱$ ..不知道!
pragmatic_programmer

7
真好!我也不知道我是否也必须逃脱“ $”!
Shadoninja'3

1
好的答案也提醒我们犯错是多么容易。在我正在处理的情况下,已经有逃脱的字符,这变得非常混乱。下面的EJK答案对我来说更有用,对于许多人来说,功能可能是一个更干净的选择:)
jerclarke

1
@jeremyclarke我不同意,转义很难,请尽量避免。
2013年

是否需要逃脱?
亚伦·弗兰克

88

在不使用别名的情况下,可以完成相同的操作。将其放在.bashrc中的函数中:

xx() {
    svn status | awk '$1 =="M"{print $2;}'
}

这样,您不必担心报价正确。这将使用与命令行完全相同的语法。


11
+1,但有一个疑问-function关键字与POSIX是不必要的不​​兼容。别管它了:xx() { ...
Charles Duffy 2013年

5
我不知道。谢谢。
EJK 2013年

1
这是简单,我喜欢它,但另一个更精确地..回答了这个问题
pragmatic_programmer

13
@pragmatic_programmer这是一个合理的解释。就个人而言,我仍然认为,尽管没有字面意义上的响应,但这个答案是更好的答案-至少有50%的时间,我们在irc.freenode.org上收到有关别名的问题#bash,答案是“使用函数代替” ; 别名除了前缀扩展之外什么也不能做,例如,如果您想在参数上分支,则别名扩展就没有用。
查尔斯·达菲

7
有时候,更确切地说是对确切问题的字面回答更为可取,但是在大多数情况下,这样的回答会更有帮助,因为它1)以一种易于理解的方式解决了最初的问题,并且2)给出了答案。为他们众所周知的工具带寻求新工具。
TecBrat 2014年

3

Bash 2.04开始,除了使用函数或转义@ffledgling的方式之外,还有第三种(更简便的)方式:使用字符串文字语法(这是一个很好的答案)。

因此,例如,如果您想为此onliner做一个别名,它将最终成为:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"{print $1" --revision "$3}\' | xargs -rn3 snap remove'

所以您只需要添加 $在字符串前面并转义单引号即可。

这带来了 一个shellcheck警告,您可以使用来安全地禁用# shellcheck disable=SC2139

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.