2

我是 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
4

2 回答 2

3

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

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

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的标准输入;第一个>只是普通的标准输出重定向。

于 2014-06-20T19:49:11.437 回答
1

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

如果您将管道移至whiptail,您将看到 的更新值andy

于 2014-06-20T19:21:59.953 回答