web-dev-qa-db-ja.com

起動時に.bashrcがエイリアスでサブコマンドを実行しないようにする方法は?

guakeターミナルを.bashrcに強制終了するエイリアスコマンドを追加しました

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"

しかし問題は、サブコマンド、つまりps aux | grep guake | head -n -1 | awk '{print $2}'が端末の起動時に実行され、killguakekill -9 result_of_subcommandに設定されることです。

killguakeを実行するたびにサブコマンドが実行/計算されるように設定する方法はありますか? guakeの最新のPIDを持つことができるようにします。

killを使用してxargsにパイプ接続することも試みましたが、これも同じ結果になり、起動時にすべてが計算されます。これは私がパイピングで試したものです

ps aux | grep guake | head -n -1 | awk '{print $2}' | xargs -I{} kill -9 {}
9
Muhammad Tahir

代わりにpkillを使用してください:

alias killguake='pkill guake'

これは、psによって出力されたプロセステーブルを解析するよりもはるかに安全です。

そうは言っても、エイリアスがなぜあなたの望むことをしないのかを説明しますが、実際にはse pkillです。

あなたのエイリアス

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"

二重引用符で囲まれています。これは、シェルがシェル初期化スクリプトでその行を解析するときに、コマンド置換($( ... ))を実行することを意味します。したがって、ファイルを実行するたびに、後でguakeをkillするためのエイリアスを与える代わりに、実行中のguakeプロセスをkillするためのエイリアスを与えます

aliasを使用して)エイリアスをリストすると、このエイリアスは次のようになります。

killguake='kill -9 91273'

または多分ちょうど

killquake='kill -9'

シェルの起動時にguakeが実行されていなかった場合。

これを修正するには(ただし、実際にはpkillを使用)、単一引用符を使用し、Awkスクリプト(現在は二重引用符で囲まれています)で$をエスケープする必要があります。

alias killguake='kill -9 $(ps aux | grep guake | head -n -1 | awk "{print \$2}")'

Oneこのアプローチの一般的な問題の1つは、他のユーザーに属するプロセスと一致することです。もう1つは、目的のプロセスの代わりに、grep guakeコマンドを見つける可能性があることです。もう1つは、プロセスが見つからなかった場合にエラーをスローすることです。もう1つは、1つの機能を実行するために5つの外部ユーティリティを呼び出すことです。

23
Kusalananda

Pkillを使用して、ホイールを再発明しないでください!

alias killguake="pkill -9 guake"
6
Ipor Sircer