BASH:通过管道传递到对话框的函数中的变量丢失

BASH: Variables in a function piped to dialog are lost

提问人:Occam's Chainsaw 提问时间:3/22/2023 最后编辑:Occam's Chainsaw 更新时间:3/22/2023 访问量:49

问:

我有一个带有函数的脚本,该函数可以做一些事情并设置一些变量以供稍后在脚本中使用。此函数还回显进度(回声 10、回声 20 等),并通过管道传输到“对话框 --gauge”以显示进度条。函数完成并对话框退出后,函数中设置的所有变量都将丢失。

为简化起见,逻辑如下:

myScript.sh

#!/bin/bash

myFunction() {
    _var1=1
    _var2=2
    _var3=3
    #Do stuff..
    echo 0
    sleep 1
    echo 25
    sleep 1
    echo 50
    sleep 1
    echo 75
    sleep 1
    echo 100
    sleep 1
}

myFunction | dialog --backtitle "Backtitle" --title "Title" --gauge "\\nWait while stuff is being done...\\n\\nProgress:" 10 60

# Or
# dialog --backtitle "Backtitle" --title "Title" --gauge "\\nWait while stuff is being done...\\n\\nProgress:" 10 60 < <(myFunction)

echo -e "Var 1: $_var1" # Is empty
echo -e "Var 2: $_var2" # Is empty
echo -e "Var 3: $_var3" # Is empty

exit 0;

关于如何在不丢失变量的情况下实现这一点的任何想法?

谢谢!

./myScript.sh
Var 1: 
Var 2: 
Var 3:

编辑:多亏了@chepner,第一条评论中提出的解决方案奏效了:myFunction > >(dialog --backtitle "Backtitle" --title "Title" --gauge "\\nWait while stuff is being done...\\n\\nProgress:" 10 60)

Linux Bash 对话框 subshell 命令替换

评论

1赞 chepner 3/22/2023
您需要在当前 shell 中执行,而不是在由管道或进程替换创建的子 shell/子进程中执行。您可以改用流程替换来运行吗?myFunctiondialogmyFunction > >(dialog ...)
2赞 chepner 3/22/2023
更好的是,您能否重构代码,使其不需要设置全局变量并为 ?myFunctiondialog
0赞 Occam's Chainsaw 3/22/2023
@chepner 感谢您的评论。不幸的是,第一个不起作用,它只是打开对话框并且没有继续(也没有回显进度,卡在 0)。第二个是可能的解决方法。我可以重建代码以在函数外部设置变量。但我很好奇这是否可以从内部完成。谢谢!
1赞 Occam's Chainsaw 3/22/2023
@user1934428 不过,它是分段的。进度回显不像 OP 中的简化脚本那样静态完成。在此函数中,需要完成几千个操作(创建文件、设置变量、向文件添加内容等)。首先在函数中计算要完成的总操作,然后在实际执行操作时(使用函数中的循环),一个变量被递增,并且与该变量的值和已知的操作总数一起,计算百分比并在每次迭代时回显。
1赞 Occam's Chainsaw 3/22/2023
@user1934428......对话框 --gauge 中的进度条正在按预期逐个填充。

答: 暂无答案