関数からジョブを呼び出すと、ジョブのリストをgrepできません。

関数からジョブを呼び出すと、ジョブのリストをgrepできません。

grepを出力できます。を出力jobsできます。しかし、なぜ関数の出力をgrepできないのですか?grepfunctionjobs

$ # 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リストにエラーは表示されませんが、私が見逃したものではありませんか?参考資料があるBash 2.02の問題whenjobsはパイプラインの一部ですが、私が見つけることができる最も近い機能ではありません。

私がここで何を見逃しているのでしょうか?

ベストアンサー1

エリックブラック回答済みbash-bugsメーリングリスト:

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

Bashには、jobs |親シェルのジョブを報告するためにパイプの左側にある唯一のコマンドで組み込みジョブを実行していることを視覚的に知らせる特別なケースコードがありますが、実行を非表示にするとその特殊なケースコードを起動できません。関数でも隠しますか?または、次のような他の方法でタスクを非表示にします。 eval jobs | grep vim

おすすめ記事