引用符を4段階で入れ子にする方法は?

引用符を4段階で入れ子にする方法は?

アンマウントが必要なときにファイルシステムをシャットダウンするようにユーザーに警告するためにウォッチで実行する複雑なコマンドがあります。以下は動作中です

watch -ben5 $'lsof /mnt/unfs && ps --no-headers -o tty -p `lsof -F p0 /mnt/unfs | sed -e "s/p//"` | xargs -I terms sudo sh -c \'echo -ne "\\n\\e[97;101mGET OUT OF UNFS\\e[31;49m cd ~ \\e[97;101mNOW!\\e[39;49m\\n" >/dev/terms\''`

しかし、もうエイリアスを定義したいのですが、答えとして「引用符を計算する」方法がわからないようです。一重引用符と二重引用符を含むコマンドを別のコマンドで囲みます。説明する。シェルは最終的にエコーされたテキストの一部を実行しようとします。

答え1

少し広げておくと簡単です。

watch -ben5 '
    lsof /mnt/unfs &&
    ps    -o tty= -p "$(lsof -F p0 /mnt/unfs | sed -e "s/p//")" |
    xargs -I terms sudo sh -c '\''
        printf "\n\33[97;101m%s\33[31;49m%s\33[97;101m%s\33[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\'''

ここで何が起こっているのかを正確に理解するのが困難です。しかし、それをエイリアスに追加するのはとても簡単です。'以下は別のエイリアスを追加するだけです。

alias myalias="$(cat <<\IN
watch -ben5 '
    lsof /mnt/unfs &&
    ps    -o tty= -p "$(lsof -F p0 /mnt/unfs | sed -e "s/p//")" |
    xargs -I terms sudo sh -c '\''
        printf "\n\33[97;101m%s\33[31;49m%s\33[97;101m%s\33[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\'''
IN
)"

ここにある文書は別の形式のシェル引用です。二重引用符を除くすべての引用符は、二重引用符で囲むことができます。したがって、ハード参照が表示されているすべての項目を見つけてエスケープして、すべてのレベルにドリルダウンできます。私の言葉はそれらすべて''\''。これを完了したら、文全体を別の引用符で囲むことができます。実際には、alias次のようなことが行われます。

alias myalias

myalias='    watch -ben5 '\''
    lsof /mnt/unfs &&
    ps    -o tty= -p "$(lsof -F p0 /mnt/unfs | sed -e "s/p//")" |
    xargs -I terms sudo sh -c '\''\'\'\''
        printf "\n\33[97;101m%s\33[31;49m%s\33[97;101m%s\33[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\''\'\'\'\'

関連情報