Я запускаю такий сценарій:
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 "ехо" Привіт $ 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
це відображається в повідомленнях про помилки / попередження оболонкою.
Якщо ви не хочете експортувати їх як змінні середовища, ось вам можна зробити трюк. Збережіть своє значення змінної у файлі .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