bash 4.3 lastpipe bug或功能?

时间:2017-07-01 19:39:01

标签: bash pipeline

我尝试在bash中使用lastpipe选项,当从交互式提示命令行运行时,它似乎无法正常工作。

phi@phiz:~$ shopt lastpipe
lastpipe        on

phi@phiz:~$ echo $BASH_VERSION
4.3.11(1)-release

phi@phiz:~$ echo yo | read a ; echo "a='$a'"
a=''

所以我没有得到$ a中的任何东西,但是如果在子流程中运行它有点工作虽然没用我在顶级交互中需要它

phi@phiz:~$ (echo yo | read a ; echo "a='$a'")
a='yo'

预计会出现这种情况吗?我完成了我的RTFM职责,无法确定这是出于意图还是出乎意料。

我是bash的新手,从其他炮弹来的时候会感到困惑

提前感谢任何建议。

1 个答案:

答案 0 :(得分:6)

从文档中引用:

  
'lastpipe'
     If set, and job control is not active, the shell runs the last
     command of a pipeline not executed in the background in the
     current shell environment.

在正常的交互式shell中,作业控制处于活动状态,因此lastpipe选项无效。在子shell中,作业控制未激活,因此lastpipe选项确实生效。

作业控制指的是使用^Z暂停作业然后使用fg恢复作业的功能,因此这是您通常需要的。在你的情况下,我可能会尝试重写而不是

a=$(echo yo); echo "a='$a'"

或者如果你真的只需要其他命令的第一行,请通过head -n1管道。

另一方面,如果您确定不需要作业控制,则可以使用set +m禁用它(如@chepner所指出的),并可选择稍后重新启用它与set -m