首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >` `shopt -s lastpipe`对bash脚本行为有什么影响?

` `shopt -s lastpipe`对bash脚本行为有什么影响?
EN

Stack Overflow用户
提问于 2016-04-01 02:06:53
回答 2查看 3.5K关注 0票数 6

我正在尝试使ffcast屏幕投射工具bash4.1向后兼容。

在这个ffcast.bash脚本中,有一行

代码语言:javascript
复制
shopt -s extglob lastpipe

lastpipe选项只有在bash 4.3之后才可用,我可以做些什么来模拟它的效果?

EN

回答 2

Stack Overflow用户

发布于 2016-04-01 02:13:28

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

代码语言:javascript
复制
# foo | bar | baz becomes ...
baz < <(foo | bar)

或命名管道(也符合POSIX)

代码语言:javascript
复制
# foo | bar | baz becomes ...
mkfifo baz_input
foo | bar > baz_input &
baz < baz_input
票数 9
EN

Stack Overflow用户

发布于 2019-09-26 13:16:10

在不使用lastpipe并启用作业控制的情况下,通常的行为是在子shell中运行管道的每个元素。

代码语言:javascript
复制
echo asd | var=$(cat) ; echo $var

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

来自man bash

流水线中的每个命令都作为单独的进程执行(即,在子subshell中)。有关子See环境的说明,请参阅命令执行环境。如果使用shopt内置启用了lastpipe选项(请参阅下面对shopt的描述),则管道的最后一个元素可能是由shell进程运行的

我不知道什么是可能是...下面是更好的描述:

lastpipe

如果设置了该选项,并且作业控制处于非活动状态,则shell将运行当前shell环境中未在后台执行的管道的最后一个命令。

所以

代码语言:javascript
复制
set +m  # To disable job control
shopt -s lastpipe
echo asd | var=$(cat)
echo $var

现在var包含了asd

谢谢@chepner。

早些时候,我常常这样写道:

代码语言:javascript
复制
{ while read;do var="$REPLY";done; } < <(command | filter)

在以下情况下

代码语言:javascript
复制
var=$(command | filter)

并不合适。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36340599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档