bash 4.3的lastpipe是一个bug还是特性?

4

我尝试在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很新,从其他shell过来后感到困惑。

提前感谢您的任何建议。

1个回答

8

从文档中引用:

'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恢复作业等类似操作,因此这通常是您需要的功能。在您的情况下,我可能会尝试重新编写,例如:
a=$(echo yo); echo "a='$a'"

如果你只需要另一个命令的第一行,可以通过head -n1来获取。

另一方面,如果你决定不需要作业控制,可以使用set +m(如@chepner所指出的那样)禁用它,随后你也可以选择使用set -m重新启用它。


1
为了完整起见,您还可以使用 set +m 禁用作业控制。 - chepner
@chepner 当然,值得一提。已添加注释,谢谢。 - user743382
谢谢,我以为我已经完成了所有 RTFM 的职责,但肯定错过了作业控制点,主要是因为在尝试完成此任务时工作控制不是我的重点 :)。这个 1 行的 echo|read 是我需要的流程,更像是一些 cmd-产生多行 | while read a b c ;做事情a b c在一个状态机; 做完。而且我不想在这个阶段上升到 awk/perl。再次感谢 set +m :) - Phi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接