Eu executo o seguinte script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Mas eu entendo:
# ./test.sh
Hello
Como posso enviar a variável VARdo meu script para o shell criado com sh -c '...'?
Eu executo o seguinte script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Mas eu entendo:
# ./test.sh
Hello
Como posso enviar a variável VARdo meu script para o shell criado com sh -c '...'?
Respostas:
Use exportpara transformá-lo em uma variável de ambiente ou passe-o diretamente para o comando.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Evite usar aspas duplas no código do shell para permitir a interpolação, pois isso introduz vulnerabilidades de injeção de comando, como em:
sh -c "echo 'Olá $ VAR'"
causando uma reinicialização se chamado quando $VARcontém algo como';reboot #
export var="Test"em uma linha.
Aqui está outra maneira de passar variáveis sh -c(como argumentos posicionais):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@que funcione conforme o esperado, por exemplo. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
$0é exibido nas mensagens de erro / aviso do shell.
Se você não deseja exportá-los como variáveis de ambiente, aqui está um truque que você pode fazer. Salve sua definição de variável em um arquivo .var_init.she origine -a em seu sub-shell da seguinte maneira:
.var_init.sh
VAR="Test"
na linha de comando:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Dessa forma, você define suas variáveis apenas na execução do seu subshell.
ENV=.var_ini.sh sh -c '...'
.var_init.shdeve ser procurado no diretório atual (ao contrário de $PATH), ele deve ser escrito. ./var_init.sh