Передайте переменную окружения в bash-скрипт, вызываемый из функции
Я имею в виду иметь:
Скрипт bash
scr.shкоторый принимает позиционные параметры#!/bin/bash echo "Params = $@" echo REMOTE_SERVER=${REMOTE_SERVER}Функция bash
fопределено в другом скриптеscr2.sh#!/bin/bash f() { REMOTE_SERVER=s001 scr.sh "${@}" }
Я бы сначала
$ source scr2.sh
а затем есть f доступно для вызова в командной строке, но не оставляет следов того, что я сделал сREMOTE_SERVER, Например, я хочу
$ f par1 par2
par1 par2
s001
$ echo REMOTE_SERVER=${REMOTE_SERVER}
REMOTE_SERVER=
(на самом деле, если REMOTE_SERVER был установлен перед использованием fЯ хочу сохранить это значение). Я не мог достичь этой последней цели. Я всегда заканчиваю с REMOTE_SERVER задавать. Я пытался использовать многострочные команды, разделенные точкой с запятой, заключая команды внутри f с круглыми скобками, но это не сработало.
Как я могу это сделать?
2 ответа
Если вы хотите установить переменную только для команды, добавьте префикс к команде:
REMOTE_SERVER=s001 scr.sh "${@}"
Альтернативно, используйте подоболочку для функции (тогда назначение переменных не повлияет на родительскую оболочку). Вы можете создать подоболочку, заключив команды в ( ... ) (круглые скобки) или использование скобок вместо фигурных скобок для тела функции. Например, с:
foo () (
REMOTE_SERVER=s001
)
bar () {
REMOTE_SERVER=s001
}
foo; echo "REMOTE_SERVER=$REMOTE_SERVER"; bar; echo "REMOTE_SERVER=$REMOTE_SERVER";
Мой вывод будет:
REMOTE_SERVER=
REMOTE_SERVER=s001
С помощью
#!/bin/bash
f() {
(
REMOTE_SERVER=s001
scr.sh "${@}"
)
}
работает отлично. Это, вероятно, эквивалентно принятому ответу, с дополнительной гибкостью, включая части кода внутри локальной оболочки и части снаружи.