在函数中调用作业时无法 grep 作业列表

在函数中调用作业时无法 grep 作业列表

我可以grep输出jobs, 我可以grep输出 a function。但为什么我不能 grepjobs函数中的输出呢?

$ # 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是一个有趣的内置命令 - 父 shell 中的作业集与子 shell 中的作业集不同。 Bash 通常会创建一个子 shell 来执行管道,并且由于该子 shell 中没有作业,因此作业的隐藏执行没有任何可报告的。

Bash 有特殊情况的代码jobs |,它可以明显地告诉您正在将内置作业作为管道左侧的唯一命令运行,以报告父 shell 的作业,但该特殊情况代码无法启动如果您隐藏作业的执行,无论是像您一样将其隐藏在函数中,还是通过其他方式,例如: eval jobs | grep vim

相关内容