bash 函数 - 获取变量内部的函数标准输出值并修改函数外部的变量

bash 函数 - 获取变量内部的函数标准输出值并修改函数外部的变量

由于特定需要,我需要将 bash 函数的所有标准输出输出存储在变量(“F_MY_FUNC_R”)中,但我还需要该函数根据修改某些变量(“VAL_A”和“VAL_B”)的值到下面的代码。

问题:为什么变量 VAL_A 和 VAL_B 没有被修改?有没有解决的办法?

代码

VAL_A="none"
VAL_B="none"
f_my_func() {
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
F_MY_FUNC_R=$(f_my_func)
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

输出

[root@localhost some_folder]# echo "$F_MY_FUNC_R"
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
[root@localhost some_folder]# echo "$VAL_A"
none
[root@localhost some_folder]# echo "$VAL_B"
none

谢谢! =D

答案1

子 shell 是 shell 中的一个基本规则不能修改其父变量或环境。在子 shell 内执行函数$(f_my_func)会受到该规则的影响,并且父变量 VAL_A 和 VAL_B 不会更改。

如果您确实需要更改函数中的父变量,则不要捕获函数的输出,而是将输出设置为其他变量:

VAL_A="none"
VAL_B="none"
f_my_func() {
    nl=$'\n'
    F_MY_FUNC_R="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
f_my_func
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

答案2

这是我的“肮脏”解决方案...=D

笔记:正如我所说,我的实际函数很大,所以我想将该函数的输出(echo基本上)保留在使用F_MY_FUNC_OP.除此之外,我的日志记录方案使用许多遗留组件F_MY_FUNC_OP并由许多遗留组件组成。

VAL_A="none"
VAL_B="none"
f_my_func() {
    echo "$(date)"
    VAL_A="some value"
    VAL_B="some value"
}
f_my_func > f_my_func_op 2>&1
F_MY_FUNC_OP=$(cat f_my_func_op)
rm -f "f_my_func_op"
echo "$F_MY_FUNC_OP"
echo "$VAL_A"
echo "$VAL_B"

这样我可以执行该函数并将其 stderr 和 stdout 重定向到一个文件,同时允许操作该函数外部的变量(“$VAL_A”和“$VAL_B”的情况),否则(“F_MY_FUNC_OP=例如,$(f_my_func)”或“F_MY_FUNC_OP=`f_my_func`”)该函数将在“子shell”中执行,并且无法操作这些变量。

感谢@jesse_b、@AdminBee 和@Isaac!=D

相关内容