Переменная из другой функции не видна? - PullRequest
0 голосов
/ 19 мая 2018

Я написал следующий скрипт:

bar() {
        echo $(foo) >&2
        echo "bar" >&2
        echo $VARIABLE >&2
}

foo() {
        echo "foo" >&2
        VARIABLE="test"
        echo $VARIABLE >&2
}
bar

Вывод

foo
test

bar

Но если бы я написал это:

bar() {
        foo
        echo "bar" >&2
        echo $VARIABLE >&2
}

foo() {
        echo "foo" >&2
        VARIABLE="test"
        echo $VARIABLE >&2
}
bar

Он печатает то, что мне нужно:

foo
test
bar
test

Вопрос в том, что мне нужно отправить результат foo на &2, но мне нужно значение VARIABLE, которое было установлено при вызове foo.Как это сделать в bash?

1 Ответ

0 голосов
/ 19 мая 2018

Bash запускает $() в подоболочке , поэтому назначение VARIABLE внутри $(foo) отбрасывается, когда $() заканчивается.Вот почему переменная не сохраняется.

Стандартный ввод / вывод / ошибка всегда доступны, если вы не измените их.Следовательно, вы должны иметь возможность:

bar() {
        foo >&2             # <-- redirect foo's output
        echo "bar" >&2
        echo $VARIABLE >&2
}

Пояснение

Вы часто можете заменить использование echo $(something) и подобных конструкций, таких как something | cat.В вашем случае:

  • foo производит вывод в стандартный вывод
  • $() копирует из стандартного вывода в командную строку
  • echo копирует из командной строкина стандартный вывод (!!)
  • >&2 перенаправляет с стандартного вывода на стандартный вывод

Последовательность echo $() имеет чистый эффект копирования с стандартного вывода на стандартный вывод :), так что вы можетепросто исключите его. *

* Но в других случаях вам может потребоваться echo $(), например, если вы используете $() для его побочных эффектов, или есливы намеренно вызываете подоболочку, чтобы защитить себя от изменения переменных тем, что вы выполняете.Тем не менее, я думаю, что эти случаи, вероятно, не являются общими.

...