`shopt -s lastpipe`如何影响bash脚本行为?

时间:2016-03-31 18:06:53

标签: bash shell

我正在努力使ffcast屏幕投射工具bash 4.1向后兼容。

并在此ffcast.bash脚本中,有oneline

shopt -s extglob lastpipe

lastpipe选项仅在bash 4.3之后可用,我该怎么做来模拟它的效果?

2 个答案:

答案 0 :(得分:1)

lastpipe(顺便说一句,在bash 4.2中引入)只能通过不使用管道来模拟。您需要在当前shell中显式运行管道的最后一个命令,并从进程替换中重定向其输入

# foo | bar | baz becomes ...
baz < <(foo | bar)

或命名管道(也符合POSIX)

# foo | bar | baz becomes ...
mkfifo baz_input
foo | bar > baz_input &
baz < baz_input

答案 1 :(得分:0)

在没有 Shell: 3.2.57 - /bin/bash Node: 10.16.3 - ~/.nvm/versions/node/v10.16.3/bin/node Yarn: 1.17.3 - ~/.nvm/versions/node/v10.16.3/bin/yarn npm: 6.9.0 - ~/.nvm/versions/node/v10.16.3/bin/npm typescript@3.6.3 且启用了作业控制的情况下,通常的行为是在子Shell中运行管道的每个元素。

lastpipe

echo asd | var=$(cat) ; echo $var 不包含任何内容,但用户可能希望var将包含var。这是因为最后一个管道元素在无法访问当前shell环境的子shell中设置了asd

来自var

  

管道中的每个命令都作为一个单独的进程(即在子shell中)执行。有关子外壳程序环境的说明,请参见命令执行环境。如果使用以下方式启用了lastpipe选项          内置shopt(请参见下面的shopt的说明),管道的最后一个元素 可能由shell进程运行。

我不知道可能是 ... 这是更好的描述:

  

man bash
                        如果已设置并且作业控制未处于活动状态,则外壳程序将在当前外壳程序环境中在后台运行未在后台执行的管道的最后一条命令。

所以

lastpipe

现在set +m # To disable job control shopt -s lastpipe echo asd | var=$(cat) echo $var 包含var

感谢@chepner。


我以前的写作习惯是:

asd

在以下情况下

{ while read;do var="$REPLY";done; } < <(command | filter)

不合适。