Я запускаю следующий скрипт:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Но я получаю:
# ./test.sh
Hello
Как я могу отправить переменную VAR
моего скрипта в оболочку, созданную с помощью sh -c '...'
?
Я запускаю следующий скрипт:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Но я получаю:
# ./test.sh
Hello
Как я могу отправить переменную VAR
моего скрипта в оболочку, созданную с помощью sh -c '...'
?
Ответы:
Либо используйте, export
чтобы превратить его в переменную окружения, либо передайте его непосредственно в команду.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Избегайте использования двойных кавычек вокруг кода оболочки, чтобы разрешить интерполяцию, поскольку это приводит к уязвимостям внедрения команд, как в:
sh -c "echo 'Hello $ VAR'"
вызывая перезагрузку, если вызывается, когда $VAR
содержит что-то вроде';reboot #
export var="Test"
в одну строку.
Вот еще один способ передачи переменных sh -c
(в качестве позиционных аргументов):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
работать как положено, например. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
отображается в сообщениях об ошибках / предупреждениях оболочкой.
Если вы не хотите экспортировать их как переменные среды, вот прием, который вы могли бы сделать. Сохраните определение variabe в файл .var_init.sh
и поместите его в свою под-оболочку следующим образом:
.var_init.sh
VAR="Test"
из командной строки:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Таким образом, вы устанавливаете свои переменные только при выполнении вашей подоболочки.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
ожидается, что это будет искать в текущем каталоге (в отличие от $PATH
), это должно быть написано. ./var_init.sh