我是个新手,所以请原谅我的无知。
在for循环中分配var时,使用Whiptail对话框时永远不会设置新值20。有什么建议吗?
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发布于 2014-06-21 03:49:11
管道中的命令(即由|分隔的一系列命令)始终在子subshell中执行,这意味着每个命令都有自己的变量环境。复合命令(…)中的命令也是如此,但复合命令{…}不是这样,它通常可用于分组,而无需创建子subshell。
在bash或zsh中,您可以使用进程替换而不是管道来解决此问题。例如:
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重定向。
发布于 2014-06-21 03:22:00
{}中的语句通常不在子shell中执行。但是,当您向其添加管道(|)时,它们似乎是在子shell中执行的。
如果删除到whiptail的管道,您将看到andy的更新值。
https://stackoverflow.com/questions/24334108
复制相似问题