首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Whiptail仪表:未设置循环中的变量

Whiptail仪表:未设置循环中的变量
EN

Stack Overflow用户
提问于 2014-06-21 03:10:22
回答 2查看 1.6K关注 0票数 2

我是个新手,所以请原谅我的无知。

在for循环中分配var时,使用Whiptail对话框时永远不会设置新值20。有什么建议吗?

代码语言:javascript
复制
andy="10"
{
    for ((i = 0 ; i <= 100 ; i+=50)); do
        andy="20"
        echo $i
        sleep 1
    done
 } | whiptail --gauge "Please wait" 5 50 0 
# }
echo "My val $andy
EN

回答 2

Stack Overflow用户

发布于 2014-06-21 03:49:11

管道中的命令(即由|分隔的一系列命令)始终在子subshell中执行,这意味着每个命令都有自己的变量环境。复合命令(…)中的命令也是如此,但复合命令{…}不是这样,它通常可用于分组,而无需创建子subshell。

bashzsh中,您可以使用进程替换而不是管道来解决此问题。例如:

代码语言:javascript
复制
andy="10"
for ((i=0 ; i <= 100 ; i+=50)); do
        andy="20"
        echo $i
        sleep 1
done > >(whiptail --gauge "Please wait" 6 50 0) 
echo "My val $andy

>(whiptail ...)将导致创建一个子subshell来执行whiptail;整个表达式将替换为该子subshell的标准输入的名称(在linux中,它类似于/dev/fd/63,但在其他操作系统上它可以是一个先进先出)。> >(...)会将标准输出重定向到子外壳的标准输入;第一个>只是一个普通的stdout重定向。

票数 3
EN

Stack Overflow用户

发布于 2014-06-21 03:22:00

{}中的语句通常不在子shell中执行。但是,当您向其添加管道(|)时,它们似乎是在子shell中执行的。

如果删除到whiptail的管道,您将看到andy的更新值。

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

https://stackoverflow.com/questions/24334108

复制
相关文章

相似问题

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