バッシュを使っています。 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
代わりにzsh
orを使用すると、エラーを理解できます。(t)csh
bash
$ ps -ef | grep [c]ron
zsh: no matches found: [c]ron
上記には、パターンと一致する現在のディレクトリのファイルのリストに拡張するように設計されたワイルドカードパターンがあります。
ただし、ほとんどの Bourne および rc 様シェルでは、一致するファイルがない場合、パターンは変更されず、自動的にコマンドに渡されます。
そのため、現在のディレクトリに呼び出されたファイルがないために動作しますが、[c]ron
現在のディレクトリにパターンと一致するファイルがあるため、機能せずにシェルによって拡張され、代わりに引数を取得します。cron
[a]2draw
a2draw
grep
a2draw
[a]2draw
この場合、bash
次のようにしてこのように動作するように設定できます。zsh
shopt -s failglob
fish
シェルはまた、globが一致しないときにエラーを報告します。ただし、[...]
ワイルドカード演算子ではありませんfish
。
つまり、ワイルドカードを拡張したくない場合は、それを引用する必要があります。
ps -ef | grep '[a]2draw'
bash
Bourne's以外のBourneに似たシェルでこれを行うことなくこれを実行できますが、これにより、一致zsh
するファイルを含むディレクトリでコマンドを実行するたびに隠されたバグが発生する可能性があります。
予期しない状況では、望ましくない副作用が発生する可能性があります。良い:
rm -?
と名前のファイルを含むディレクトリから--
削除され-x
ます。-y
-x
-y