grep
を出力できます。を出力jobs
できます。しかし、なぜ関数の出力をgrepできないのですか?grep
function
jobs
$ # 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