grep
の出力をjobs
でき、grep
の出力をfunction
できます。しかし、関数内にあるときにjobs
の出力をgrepできないのはなぜですか?
$ # yes, i can grep jobs
$ jobs
[1]+ Running vim
[2]+ Stopped matlab
$ jobs | grep vim
[1]+ Running vim
$ # yes, of course i can grep a function
$ type mockjobs
mockjobs is a function
mockjobs ()
{
echo '[1]+ Running vim banjo'
}
$ mockjobs | grep vim
[1]+ Running vim banjo
$ # now put those two together and surely I can grep???
$ type realjobs
realjobs is a function
realjobs ()
{
jobs
}
$ realjobs | grep vim
$ # Nope, WTF?
$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ # funny though, redirection works just fine:
$ tmpfile=$(mktemp); realjobs > $tmpfile; grep vim $tmpfile; rm $tmpfile
[1]+ Running vim
Bashリストにバグは表示されていませんが、見逃した可能性がありますか? jobs
がパイプラインの一部である場合、 Bash 2.02の問題 への参照がありますが、最近のものはなく、私が見つけることができる関数にあります。
ここで何が欠けていますか?
Eric Blake 回答済み bash-bugsメーリングリスト:
jobs
は興味深い組み込みです。親シェルのジョブのセットは、サブシェルのジョブのセットとは異なります。 Bashは通常、パイプラインを実行するためにサブシェルを作成します。そのサブシェルにはジョブがないため、ジョブの非表示の実行は報告するものがありません。Bashには、パイプの左側の唯一のコマンドとして組み込みのジョブを実行していることが明らかな場合に、親シェルのジョブについてレポートするための特別な場合の
jobs |
のコードがありますが、その特別な-ジョブの実行を非表示にした場合、それを関数内に非表示にするか、次のような他の方法で非表示にすると、ケースコードを開始できません。eval jobs | grep vim