代码如下:
#! /bin/bash
function foo() {
G1=123
echo "ReturnVal"
}
RV="$(foo)"
echo "RV=$RV, G1=$G1" # RV=ReturnVal, G1=
foo >/dev/null
echo "G1=$G1" # G1=123
我想要执行该函数,设置全局变量 G1,并将该函数的标准输出捕获到一个变量中。
第一次调用无法设置全局变量,因为该函数正在子 shell 中执行。但这是将 stdout 放入变量的规范方法。
我意识到对 foo() 的第二次调用会丢弃 stdout。将其写入控制台对于我的目的来说同样毫无意义。但它说明该函数能够设置全局变量。
请注意,任何解决方案都不能使用文件系统上的临时文件。我实际上试图编写的函数已经处理了临时文件及其自动清理;引入另一个临时文件不是一个选择。
有办法吗?
答案1
你之前用过 Java、C++ 吗?这看起来不像是我见过的 BASH。
#!/bin/bash
myFunction()
{
echo eval "
G1=\"123\";
echo \"My function \$G1\"; "
}
myVar=$(myFunction 2>&1);
source <(myFunction) 2>&1 >/dev/null;
echo "G1: $G1";
eval echo "myVar: $(grep -v eval <($myVar))"
非常混乱,因为不允许将变量从子进程导出到其父进程。
G1: 123
myVar: My function 123
答案2
我最近自己遇到了这个问题,但就我而言,我无法将我的代码分成两个独立的函数,也无法预测我要设置的全局变量的名称。
以下是我想到的。调用语法不同,但很简单。不过,可能需要对反斜杠转义进行一些调整。
基本上,它的工作原理类似read
,但同时设置一个全局变量。
#!/usr/bin/env bash
function do_your_thing() {
local name_of_capture_var="${1}"
global_var="global global global global global"
normally_sent_to_stdout="stdout stdout stdout stdout"
eval "${name_of_capture_var}=\"${normally_sent_to_stdout}\""
}
function main() {
local capture
do_your_thing capture
echo "In main():"
echo "capture: ${capture}"
echo "global_var: ${global_var}"
echo
}
main
echo "Outside of main()"
echo "capture: ${capture}"
echo "global_var: ${global_var}"