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 $()
, например, если вы используете $()
для его побочных эффектов, или есливы намеренно вызываете подоболочку, чтобы защитить себя от изменения переменных тем, что вы выполняете.Тем не менее, я думаю, что эти случаи, вероятно, не являются общими.