一重引用符と二重引用符の両方を使用したbashエイリアスコマンド


85

やりたいことを実行するこのコマンドがありますが、.bashrcでエイリアスを作成できません(一重引用符と二重引用符の両方を使用していることに注意してください)。

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

私はもう試した:

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

そして、運がない他のいくつかの常識的な組み合わせ..私はbashが引用符で非常にうるさいことを知っています..それでそれをエイリアスする正しい方法は何ですか、そしてなぜですか?ありがとう

回答:


114

あなたはそれを正しくエスケープする必要があります。

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

16
だから私は$を逃れていませんでした..それを知りませんでした!
pragmatic_programmer

7
いいね!私も「$」をエスケープする必要があることを知りませんでした!
Shadoninja 2016年

1
良い答えですが、間違いを犯しやすいことを思い出させてくれます。私が扱っていた場合、すでにエスケープ文字があり、それは大きな混乱を引き起こしました。以下のEJKの答えは私にとってより有用でした、関数はおそらく多くの人にとってよりクリーンなオプションです:)
jerclarke 2016年

1
@jeremyclarke私は同意しません、逃げるのは難しいです、できればそれを避けてください。
2016年

`をエスケープする必要がありますか?
アーロンフランケ2018

92

これは、エイリアスを使用せずに同じことを実現するものです。.bashrcの関数に入れてください:

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

このようにして、見積もりを正しく取得することを心配する必要はありません。これは、コマンドラインで使用するのとまったく同じ構文を使用します。


12
+1、しかし1つの疑問-functionキーワードはPOSIXとの不必要な非互換性です。そのままにしておいてください:xx() { ...
Charles Duffy

5
知らなかった。ありがとう。
EJK 2013年

2
。これはそれのような単純かつIであるが、他の一つは、より正確に質問に答え
pragmatic_programmer

13
@pragmatic_programmerそれは公正な解釈です。個人的には、文字通りの意味で応答しないにもかかわらず、この答えの方が優れていると私は考えています。少なくとも50%の確率で、irc.freenode.orgのエイリアスに関する質問が#bashあり、答えは「代わりに関数を使用する」です。 ; エイリアスはプレフィックス拡張以外のことはできません。これは、たとえば引数で分岐する場合には役立ちません。
Charles Duffy

8
正確な質問に対する文字通りの答えがはるかに好まれる場合がありますが、ほとんどの場合、このような答えは、1)最初の問題をわかりやすく解決し、2)を与えるため、はるかに役立ちます。彼らのことわざのツールベルトのための新しいツールを求めてください。
TecBrat 2014年

3

Bash 2.04以降、関数を使用するか、@ ffledglingが行った方法を回避する以外に、文字列リテラル構文を使用する3番目の(より簡単な)方法があります(これは優れた答えです)。

したがって、たとえば、このオンラインのエイリアスを作成したい場合は、次のようになります。

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

したがって$、文字列の前にを追加し、一重引用符をエスケープする必要があります。

これがもたらす警告shellcheckをあなたは安全に無効おそらく可能性を持ちます# shellcheck disable=SC2139

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.