PS | grep はサブシェルから無効な出力を表示し、ジョブはバックグラウンドで実行されます。

PS | grep はサブシェルから無効な出力を表示し、ジョブはバックグラウンドで実行されます。

バッシュを使っています。 1行だけを含む「a2draw」というファイルがあります。

sleep 99999

次のコマンドを使用して起動します。

bash a2draw &

今、私はps出力からgrepプロセスを省略することができる角かっこトリックを知って理解します。

ps aux | grep cron
root      1079  0.0  0.0   2596   788 ?        Ss   Mar25   0:00 cron
root      1119  0.0  0.0   3684   696 ?        Ss   Mar25   0:00 /usr/sbin/incrond -f /etc/incron.conf
ja       29781  0.0  0.0   4368   820 pts/10   S+   12:49   0:00 grep cron

ps aux | grep [c]ron
root      1079  0.0  0.0   2596   788 ?        Ss   Mar25   0:00 cron
root      1119  0.0  0.0   3684   696 ?        Ss   Mar25   0:00 /usr/sbin/incrond -f /etc/incron.conf

ただし、バックグラウンドでジョブを実行するサブシェルでは機能しません。

jobs
[1]+  Running                 bash a2draw &

ps aux | grep [a]2draw
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw
ja       30242  0.0  0.0   4364   816 pts/10   R+   12:50   0:00 grep

見知らぬ人でもプロセス名から文字を削除すると、正しい結果が得られます。

ps aux | grep [a]2dra
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw

他のシェルでは、すべてが期待どおりに動作します。

ps aux | grep [a]2draw
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw

ps aux | grep [a]2dra
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw

何が起こったのかわかりません。パイプラインの生成方法を変更するバックグラウンドタスクに特別なことがありますか?

答え1

代わりにzshorを使用すると、エラーを理解できます。(t)cshbash

$ ps -ef | grep [c]ron
zsh: no matches found: [c]ron

上記には、パターンと一致する現在のディレクトリのファイルのリストに拡張するように設計されたワイルドカードパターンがあります。

ただし、ほとんどの Bourne および rc 様シェルでは、一致するファイルがない場合、パターンは変更されず、自動的にコマンドに渡されます。

そのため、現在のディレクトリに呼び出されたファイルがないために動作しますが、[c]ron現在のディレクトリにパターンと一致するファイルがあるため、機能せずにシェルによって拡張され、代わりに引数を取得します。cron[a]2drawa2drawgrepa2draw[a]2draw

この場合、bash次のようにしてこのように動作するように設定できます。zsh

shopt -s failglob

fishシェルはまた、globが一致しないときにエラーを報告します。ただし、[...]ワイルドカード演算子ではありませんfish

つまり、ワイルドカードを拡張したくない場合は、それを引用する必要があります。

ps -ef | grep '[a]2draw'

bashBourne's以外のBourneに似たシェルでこれを行うことなくこれを実行できますが、これにより、一致zshするファイルを含むディレクトリでコマンドを実行するたびに隠されたバグが発生する可能性があります。

予期しない状況では、望ましくない副作用が発生する可能性があります。良い:

rm -?

と名前のファイルを含むディレクトリから--削除され-xます。-y-x-y

関連情報