Переменная среды передачи для избиения сценария, названного из функции

Я означаю иметь:

  1. Сценарий удара scr.sh это берет позиционные параметры

    #!/bin/bash
    echo "Params = $@"
    echo REMOTE_SERVER=${REMOTE_SERVER}
    
  2. Функция удара 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 с круглой скобкой, но это не работало.

Как я могу сделать это?

0
задан 25 September 2018 в 07:54

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
2
ответ дан 27 October 2019 в 10:07

Используя

#!/bin/bash
f() {
    (
        REMOTE_SERVER=s001
        scr.sh "${@}"
    )
}

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

1
ответ дан 27 October 2019 в 10:07

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

Похожие вопросы: