web-dev-qa-db-ja.com

関数でジョブが呼び出されたときにジョブリストをgrepできません

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の問題 への参照がありますが、最近のものはなく、私が見つけることができる関数にあります。

ここで何が欠けていますか?

7
bishop

Eric Blake 回答済み bash-bugsメーリングリスト:

jobsは興味深い組み込みです。親シェルのジョブのセットは、サブシェルのジョブのセットとは異なります。 Bashは通常、パイプラインを実行するためにサブシェルを作成します。そのサブシェルにはジョブがないため、ジョブの非表示の実行は報告するものがありません。

Bashには、パイプの左側の唯一のコマンドとして組み込みのジョブを実行していることが明らかな場合に、親シェルのジョブについてレポートするための特別な場合のjobs |のコードがありますが、その特別な-ジョブの実行を非表示にした場合、それを関数内に非表示にするか、次のような他の方法で非表示にすると、ケースコードを開始できません。eval jobs | grep vim

8
bishop