
プロセスが消費するメモリの量を知るために、このワンライナーが与えられました。
$ 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\"}'"
上記では次のことを行いました。
エイリアスの値を二重引用符で囲む
alias mm="ps -u ...."
エスケープされたawkの二重引用符
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
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