Передайте переменную окружения в 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 "${@}"
)
}
работает отлично. Это, вероятно, эквивалентно принятому ответу, с дополнительной гибкостью, включая части кода внутри локальной оболочки и части снаружи.