Я запускаю следующий скрипт:
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