9

コマンドのエイリアスを作成してメモリ使用量を確認しようとしていますが、

ps -u user -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'

しかし、素朴な、

#.bash_aliases
alias totalmem='ps -u user -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}''

エラーが発生します:

-bash: alias: END: not found
-bash: alias: {print: not found
-bash: alias: sum/1024}: not found

二重引用符で試してみましたが、

totalmem ="ps ... |awk '{sum+=$1} END {print sum/1024}'"、 また

totalmem ='ps ... |awk "{sum+=$1} END {print sum/1024}"'、エスケープ、

totalmem ='ps ... |awk \'{sum+=$1} END {print sum/1024}\''、または二重引用符をエスケープします...しかし、私はそれを機能させることができないようです。

totalmem ='ps ... |awk \"{sum+=$1} END {print sum/1024}\"'

エラーを与える

awk: "{sum+=}
awk: ^ unterminated string

ヒントをいただければ幸いです。

4

3 に答える 3

17

エイリアスの代わりにシェル関数を使用すると、引用の問題を回避できます。

totalmem () {
  ps -u user -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'
}

totalmem次の例のように、ユーザー名などの引数を の-uオプションに渡すことができるため、これはより柔軟ですps

totalmem () {
  ps -u "$1" -o rss,command | grep -v peruser | awk '{sum+=$1} END {print sum/1024}'
}
于 2013-01-28T11:28:37.297 に答える
10

あなたはほとんどそれを持っています$、それは二重引用符で拡張されるでしょう、それでそれは余分なエスケープを必要とします:

alias totalmem='ps -u user -o rss,command | grep -v peruser | awk "{sum+=\$1} END {print sum/1024}"'

または、 iiSeymourawkによって提案されたパターンを内側に使用します。

alias totalmem='ps -u user -o rss,command | awk "!/peruser/ {sum+=\$1} END {print sum/1024}"'
于 2013-01-28T11:20:14.163 に答える
9

このような:

alias totalmem='ps -u user -o rss,command | grep -v peruser | awk '\''{sum+=$1} END {print sum/1024}'\'

説明:同じ引数に対して、のように異なる種類の引用符を使用できます"I'm double-quoted"'and I am $HOME-less'-and-i-am-not-quoted。したがって、一重引用符の中に一重引用符が必要な場合は、'\''(1)一重引用符を終了する、(2)文字通りの一重引用符を追加する\'、(3)再び一重引用符を開始するものを追加できます。

(このサイズのエイリアスは、関数としてより適切に実行されるものです)。

于 2013-01-28T11:18:21.120 に答える