带有单引号和双引号的bash alias命令

pra*_*mer 63 linux bash quotes double-quotes

我有这个命令做我想要的但我无法在我的.bashrc中对其进行别名(注意它使用单引号和双引号):

svn status | awk '$1 =="M"{print $2;}'
Run Code Online (Sandbox Code Playgroud)

我试过了:

alias xx="svn status | awk '$1 ==\"M\"{print $2;}'"
Run Code Online (Sandbox Code Playgroud)

还有其他一些没有运气的常识组合..我知道bash非常挑剔引号..所以什么是别名的正确方法,为什么?谢谢

ffl*_*ing 74

你只需要正确地逃脱它.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"
Run Code Online (Sandbox Code Playgroud)

  • 所以我没有逃避$ ..不知道那个! (9认同)
  • 太好了!我不知道我也不得不逃避'$'! (3认同)
  • 很好的答案,但也提醒我们,犯错误是多么容易。在我正在处理的情况下,已经有转义的字符,这造成了巨大的混乱。EJK 下面的答案对我来说更有用,函数对于许多人来说可能是一个更干净的选择:) (2认同)

EJK*_*EJK 70

这是在不使用别名的情况下完成同样的事情.将它放在.bashrc中的函数中:

xx() {
    svn status | awk '$1 =="M"{print $2;}'
}
Run Code Online (Sandbox Code Playgroud)

这样您就不必担心报价恰到好处.这使用与命令行完全相同的语法.

  • @pragmatic_programmer这是一个公平的解释.就个人而言,我仍然认为这个答案是更好的,尽管没有字面意义上的响应 - 至少有50%的时间我们在irc.freenode.org的`#bash`中得到关于别名的问题,答案是"使用一个函数而不是"; 别名除了前缀扩展之外什么都不做,如果你想在例如参数上进行分支,那么它就无用了. (12认同)
  • +1,但有一个狡辩 - "function"关键字是与POSIX不必要的不​​兼容.把它关掉:`xx(){...` (9认同)
  • 有时候对确切问题的字面答案更为优选,但大多数时候,像这样的答案更有帮助,因为它1)以易于理解的方式解决初始问题,2)给出问一个他们众所周知的工具带的新工具. (7认同)
  • 我不知道.谢谢. (5认同)
  • 这更简单,我喜欢它,但另一个更准确地回答了这个问题.. (3认同)

Pab*_*o A 5

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

因此,例如,如果您想为这个在线用户创建一个别名,它最终将是:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"{print $1" --revision "$3}\' | xargs -rn3 snap remove'
Run Code Online (Sandbox Code Playgroud)

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

这会带来一个 shellcheck 警告,您可以使用# shellcheck disable=SC2139.