我可以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