Передайте переменную окружения в bash-скрипт, вызываемый из функции

Я имею в виду иметь:

  1. Скрипт bash scr.sh который принимает позиционные параметры

    #!/bin/bash
    echo "Params = $@"
    echo REMOTE_SERVER=${REMOTE_SERVER}
    
  2. Функция 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 "${@}"
    )
}

работает отлично. Это, вероятно, эквивалентно принятому ответу, с дополнительной гибкостью, включая части кода внутри локальной оболочки и части снаружи.

Другие вопросы по тегам