Вот код:

#! /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 и записать стандартный вывод функции в переменную.

Первый вызов не может установить глобальную переменную, потому что функция выполняется в подоболочке. Но это канонический способ получить стандартный вывод в переменную.

Я понимаю, что второй вызов функции foo() выбрасывает стандартный вывод. Запись этого на консоль одинаково бессмысленна для моей цели. Но это показывает, что функция способна устанавливать глобальную переменную.

Обратите внимание, что ни одно решение не может использовать временный файл в файловой системе. Функция, которую я на самом деле пытаюсь написать, уже имеет дело с временными файлами и их автоматической очисткой; введение другого временного файла не вариант.

Есть ли способ?

2 ответа2

1

Я сам столкнулся с этой проблемой недавно, но в моем случае я не мог разделить свой код на две отдельные функции и не мог предсказать имя глобальной переменной, которую собирался установить.

Вот то, что я придумал. Синтаксис вызова другой, но достаточно простой. Однако это может потребовать некоторых действий с обратными слэшами.

По сути, это работает как 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}"
0

Вы пришли с 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .