Я означаю иметь:
Сценарий удара scr.sh
это берет позиционные параметры
#!/bin/bash
echo "Params = $@"
echo REMOTE_SERVER=${REMOTE_SERVER}
Функция удара 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
с круглой скобкой, но это не работало.
Как я могу сделать это?
Если Вы хотите установить переменную только для команды, снабдите префиксом присвоение на команду:
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 "${@}"
)
}
хорошо работает. Это, вероятно, эквивалентно принятому ответу с дополнительной гибкостью включения частей кода в локальной оболочке и частей снаружи.