Eu executo o seguinte script:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Mas eu entendo:
# ./test.sh
Hello
Como posso enviar a variável VAR
do 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 VAR
do meu script para o shell criado com sh -c '...'
?
Respostas:
Use export
para 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 $VAR
conté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.sh
e 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.sh
deve ser procurado no diretório atual (ao contrário de $PATH
), ele deve ser escrito. ./var_init.sh