エイリアスを作成するために一重引用符を正しくエスケープする方法

エイリアスを作成するために一重引用符を正しくエスケープする方法

私のプロセスが消費するメモリの量を知るためにこの行を得ました。

$ ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

このコマンドのエイリアスを作成したいのですが、'エスケープ文字に問題があります。

$ alias mm=ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
bash: alias: -u: not found
bash: alias: myuser: not found
bash: alias: -o: not found
bash: alias: pid,rss,command: not found
Total 0 MB

一重引用符をエスケープしようとしましたが、まだ機能しません。

$ alias mm='ps -u $USER -o pid,rss,command | \
    awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
> 

このエイリアスの作成方法を理解するのに役立ちますか?

答え1

エイリアスにするには(可能であれば)、エイリアスの値全体を二重引用符で囲む必要があります。したがって、エイリアスの一部の項目もエスケープする必要があり、すべてのフィールドパラメータもエスケープする必要があります。awkこれは、エイリアスを設定するとBashがパラメータとして解釈されるためです。

これは私にとって効果的です。

$ alias mm="ps -u $USER -o pid,rss,command | \
    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"

上記では、私は次のことをしました。

  1. エイリアス値は二重引用符で囲まれています。

    alias mm="ps -u ...."
    
  2. awkの二重引用符をエスケープする

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. awkフィールドエスケープ

    awk '{print \$0}{sum+=\$2} END
    

これを使用しますか?

おそらくそうではありません。何が起こっているのかを維持し理解するのが簡単なので、Bash機能に切り替えます。しかし、まだ必要な場合は、エイリアスは次のようになります。

答え2

このエイリアスの作成方法を理解するのに役立ちますか?

Bashを使用している場合は、関数を作成して.bashrcに入れることをお勧めします。

mm() {
  ps -u "$USER" -o pid,rss,command |
    awk '{print $0}{sum+=$2}
         END {print "Total", sum/1024, "MB"}'
}

この場合、bash変数を引用する必要があります。関数内ですべてを1行に入れる必要はありません。

答え3

エスケープコマンドは次のとおりです。

alias mm='ps -u $USER -o pid,rss,command | \
    awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'

シェルで引用符をエスケープする例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

開いたもの(')を完成させ、エスケープされたもの(\')を配置し、他のもの(')を開きます。

または:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

これは開いた引用文(')を完成させ、その引用文を別の引用文("'")に入れてから、別の引用文()を開いて'実行します。

関連:一重引用符で囲まれた文字列から一重引用符をエスケープする方法は?スタックオーバーフローSEから

関連情報