由于特定需要,我需要将 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
子shell不能修改其父变量或环境,这是shell 的基本规则。在子 shell
$(f_my_func)
中执行函数会受到该规则的影响,并且父变量 VAL_A 和 VAL_B 不会更改。如果您确实需要更改函数中的父变量,则不要捕获函数的输出,将输出设为其他变量:
这是我的“肮脏”解决方案... =D
注意:正如我所说,我的实际功能很大,所以我想将此功能的输出(
echo
基本上)保存在一个日志文件中,该文件由F_MY_FUNC_OP
. 除此之外,我的日志记录方案使用并由F_MY_FUNC_OP
许多遗留组件组成。这样,我可以执行函数并将其 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