.bashrcが起動時にエイリアスからサブコマンドを実行するのを防ぐ方法は? [コピー]

.bashrcが起動時にエイリアスからサブコマンドを実行するのを防ぐ方法は? [コピー]

guake端末を終了するエイリアスコマンドを追加しました。.bashrc

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

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

サブコマンドが実行されるたびに実行/評価されるように設定する方法はありますかkillguake?このようにして、guakeの最新のPIDを取得できます。

kill私はまたパイプを使ってみましたがxargs、それはまた開始時にすべてが計算されるという同じ結果につながりました。これがパイプを使用する方法です。

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

答え1

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

alias killguake='pkill guake'

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

それでは、エイリアスが好きなように機能しない理由を説明します。しかし実際には使用pkill

あなたのエイリアス

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

二重引用符の中にあります。これは、シェルがシェル初期化スクリプトでこの行を解析するときにコマンド置換($( ... ))を実行することを意味します。したがって、ファイルが実行されるたびに後で終了するエイリアスを提供するのではなく、実行中のプロセスを終了するguakeエイリアスを提供します。guake

エイリアスを一覧表示すると、エイリアス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}")'

一つ一般に、このアプローチの問題は、他のユーザーに属するプロセスを一致させることです。もう1つの理由は、grep guake予想されるプロセスではなくコマンドのみを見つけることができることです。別の方法は、プロセスが見つからないとエラーが発生することです。別の状況は、5つの外部ユーティリティを呼び出してそのうちの1つを実行する場合です。

答え2

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

alias killguake="pkill -9 guake"

関連情報