是bash和whiptail的新手,所以请原谅无知。
在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
答案 0 :(得分:2)
管道内的命令(即由|
分隔的一系列命令)总是在子shell中执行,这意味着每个命令都有自己的变量环境。复合命令(…)
中的命令也是如此,但复合命令{…}
不是这样,它通常可用于分组而不创建子shell。
在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 ...)
将导致创建子shell以执行whiptail
;整个表达式将被替换为此子shell的标准输入的名称(在linux中,它将类似于/dev/fd/63
,但它可能是其他操作系统上的FIFO)。 > >(...)
导致标准输出重定向到子shell的标准输入;第一个>
只是一个正常的标准重定向。
答案 1 :(得分:1)
{}
内的语句通常不在子shell中执行。但是,当您向其中添加管道(|
)时,它们似乎在子shell中执行。
如果您将管道移至whiptail
,您会看到更新值andy
。