web-dev-qa-db-ja.com

エイリアスで 'を使用する方法は?

エイリアスを使用して呼び出したい1行があります。

while printf '%s ' "$(df -P / | awk 'NR==2 { print $(NF-1) }')"; do sleep 30; done

逃げようとした' お気に入り \'しかし、それは機能しませんでした。

エイリアスで上記のワンライナーを使用するための正しい構文は何ですか?

4
Radek
_alias my_du=$'while printf \'%s \' "$(df -P / | awk \'NR==2 { print $(NF-1) }\')"; do sleep 3; done'
_

結果はで確認できます

_alias my_du
_

$()が_"_または_'_ではなく_\_によって引用されている場合、それは置換され、意図されたプログラム呼び出しではなく結果がエイリアス定義の一部になります。

4
Hauke Laging

これはエイリアスにまとめることができますが、一般的には関数が好まれます。 man bashから:

ほとんどすべての目的で、エイリアスはシェル関数に置き換えられます。

関数形式のエイリアス:

my_du() {
    while printf '%s ' "$(df -P / | awk 'NR==2 { print $(NF-1) }')"
    do
        sleep 30
    done
}

それはより読みやすく、そのためより保守しやすいです。

5
l0b0

\は文字通り一重引用符のコンテキストで使用されるため、一重引用符で囲まれている間は一重引用符をエスケープできません。エスケープする前に一重引用符を閉じるか、二重引用符を使用することをお勧めします。

alias my_du="while printf '%s ' \"\$(df -P / | awk 'NR==2 { print \$(NF-1) }')\"; do sleep 30; done"
4
Chris Down

バックスラッシュ自体は文字通りに解釈されるため、バックスラッシュを使用して、単一引用符で囲まれた文字列内の単一引用符をエスケープすることはできません。

4文字のシーケンス'\''を記述することにより、一重引用符で囲まれた文字列内の一重引用符を効果的にエスケープできます。正式には、これは一重引用符で囲まれたリテラルを終了し、リテラルの一重引用符を追加し、新しい一重引用符で囲まれたリテラルを開始します。最終的な結果として、一重引用符で囲まれたリテラルの途中に一重引用符があります。

alias foo='while printf '\''%s '\'' "$(df -P / | awk '\''NR==2 { print $(NF-1) }'\'')"; do sleep 30; done'

このような複雑なエイリアスはお勧めしません。エイリアスは、主にコマンドに短い名前を付けることを目的としており、場合によってはスイッチを使用します。これは彼らの快適範囲をはるかに超えています。代わりに関数を使用してください。

foo () {
  while printf '%s ' "$(df -P / | awk 'NR==2 { print $(NF-1) }')"; do sleep 30; done
}

引数を取るコマンド、または環境と何らかの方法で相互作用するコマンドが必要な場合は、関数を使用してください。少なくともbashでは、エイリアスは定義時に展開され、引数を取るか変数を使用するかのように動作します可能性があります。時々。マーフィーの法則は、本当に必要なときにそれが機能しないことを保証します。

1
vonbrand