web-dev-qa-db-ja.com

一重引用符と二重引用符の両方を含むbash aliasコマンド

私は私がしたいことをするこのコマンドを持っていますが、.bashrcでエイリアスを取得することはできません(一重引用符と二重引用符の両方を使用することに注意してください):

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

私はもう試した:

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

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

61

正しくエスケープする必要があります。

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

エイリアスを使用せずに同じことを実現するものを次に示します。それを.bashrcの関数に入れます:

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

これにより、引用符を正しく取得することを心配する必要がなくなります。これは、コマンドラインで使用するのとまったく同じ構文を使用します。

67
EJK

関数を使用するか、@ ffledglingが行った方法をエスケープする以外に、3番目の方法(簡単だとわかりました)があります。文字列リテラル構文を使用します( here is a excellent answer )。

たとえば、 this onliner のエイリアスを作成したくない場合は、次のようになります。

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

したがって、文字列の前に$を追加し、一重引用符をエスケープするだけです。

1
Pablo Bianchi