Eu tenho 2 scripts Shell. O primeiro aciona o segundo e adiciona alguns parâmetros. O segundo chama um comando e adiciona os parâmetros do primeiro script como parâmetros para o comando.
O primeiro parece algo como:
#!/usr/bin/env bash
ADDITIONAL_ARGUMENTS='--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'
SUPER_PARAMS=${ADDITIONAL_ARGUMENTS} my_second_script.sh
Então, o segundo script faz algo como:
#!/usr/bin/env bash
randomBinary --some-hardcoded-parameters \
"${SUPER_PARAMS}"
O que eu esperaria ter é uma saÃda de:
randomBinary --some-hardcoded-parameters --set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"
Mas, em vez disso, a chamada se parece com:
randomBinary --some-hardcoded-parameters '--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'
Tentei 2 dias citando o parâmetro corretamente, mas sem resultados.
Para armazenar vários argumentos, use uma matriz, não uma variável escalar.
Observe que, como as variáveis ​​de ambiente são sequências de bytes não NUL, você precisa de alguma codificação se quiser passar uma definição de array para outro comando por meio do ambiente.
Com
ksh
,bash
,zsh
ouyash
você pode usar:para exportar a definição de array em uma variável de ambiente no script de chamada.
E
eval "$ARRAY_DEFINITION"
no script chamado para importar essa definição de array.Observe que é importante que o código seja avaliado na mesma localidade e com o mesmo shell em que foi gerado.
Observe também que, se a definição de array for avaliada dentro de uma função, o array será local para a função.
Alguns shells como
rc
,es
oufish
permitem exportar matrizes (usando sua própria codificação internamente).Aqui, seria mais fácil passar as informações como argumentos para o script chamado, já que é um array.
No script de chamada:
No script chamado:
Ou chame o script chamado com
.
para que ele compartilhe as variáveis ​​de shell do chamador para que você não precise usar o ambiente para passar esses dados em uma execução.Aqui,
SUPER_PARAMS
contém--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"
, e como está entre aspas, é passado como está. Se não estivesse entre aspas, seria dividido em espaço em branco para as cinco strings--set
,"args={/bin/bash,-c,cd
,/var/www
,&&
,sudo -u www-data bash scripts/system/update.sh}"
, e essas seriam passadas como argumentos.Parece que você deseja que as aspas dentro da variável também sejam interpretadas, e isso requer a adição de outra camada de análise de shell, com
eval
ou executando a coisa atravésbash -c '...'
O script de teste aqui:
estampas:
(O script
args.sh
imprime o número é o número de argumentos distintos e os próprios argumentos são impressos dentro de<...>
)Observe que o
eval
executará, por exemplo, quaisquer substituições de comando, portanto, abre a execução de código arbitrário. Normalmente, seria melhor manter os argumentos em uma matriz de shell , mas aqui você os está passando de um script para outro, então isso não funciona muito bem. Consulte a seção "Como armazeno um comando em uma variável?" nesta resposta sobre como lidar com espaços em branco .Também Word Splitting in the Bash Guide , e você também pode usar
set -x
para ver quais comandos o shell realmente executa.