设置全局变量并使用 bash 函数中的 stdout

设置全局变量并使用 bash 函数中的 stdout

代码如下:

#! /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}"

相关内容