我是新手,所以原谅我的无知。
当在for循环中分配变量时,在使用鞭尾对话框时永远不会设置新值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
管道中的命令(即由|
分隔的一系列命令)总是在子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的标准输入;第一个>
只是一个普通的标准输出重定向。
{}
中的语句通常不会在子shell中执行。然而,当你给它添加一个管道(|
)时,它们似乎在子shell中执行。
如果您删除到whiptail
的管道,您将看到andy
的更新值