Passando um argumento com aspas duplas e simples para outra chamada em bash [closed]

0

Eu tenho uma chamada

./run.sh name --vars="service_name='someothername'"

e estou tentando chamar outro programa com exatamente o mesmo argumento --vars="service_name='someothername'" de run.sh , no entanto, sempre que eu faço, o Bash coloca aspas simples em torno da variável $2 quando tento fazer

cmd=$(runother $2 | process output)

Eu recebo um dos

  • runother '"--vars=service_name='\''someother..
  • runother '--vars=service_name='\''someother
  • runother '--vars=service_name=someother'

Eu tentei colocar aspas duplas em torno de $2 , removendo aspas simples como ${2//\'} , imprimindo a string como printf dentro da sub-bash.

UPD : Aparentemente, os programas consideram ./a --b=c e ./a '--b=c' da mesma forma, então a pergunta não tem significado, e eu tive um bug em uma parte diferente do código.

UPD2 : Como mencionado por @choroba no comentário abaixo: " set -x adiciona cotações à saída para que você possa descobrir como a divisão de palavras funcionou, elas não são realmente adicionadas a as strings , embora "

    
por Ben Usman 18.07.2018 / 02:17

2 respostas

2

A cotação dupla $2 (se é onde o valor está) é a coisa correta a ser feita.

Se você está olhando para a saída de set -x , esteja ciente de que o shell pode adicionar várias cotações nessa saída. Essas citações extras não fazem parte dos dados.

Exemplo (em bash ):

var=--vars="service_name='someothername'"
printf 'var has value %s\n' "$var"

Isto irá produzir

var has value --vars=service_name='someothername'

mas a saída set -x será

$ set -x
$ var=--vars="service_name='someothername'"
+ var='--vars=service_name='\''someothername'\'''
$ printf 'var has value %s\n' "$var"
+ printf 'var has value %s\n' '--vars=service_name='\''someothername'\'''
var has value --vars=service_name='someothername'

Em pdksh no OpenBSD:

$ set -x
$ var=--vars="service_name='someothername'"
+ var=--vars=service_name='someothername'
$ printf 'var has value %s\n' "$var"
+ printf var has value %s\n --vars=service_name='someothername'
var has value --vars=service_name='someothername'

Em zsh :

$ set -x
$ var=--vars="service_name='someothername'"
+zsh:10> var='--vars=service_name='\''someothername'\'
$ printf 'var has value %s\n' "$var"
+zsh:11> printf 'var has value %s\n' '--vars=service_name='\''someothername'\'
var has value --vars=service_name='someothername'

Não se preocupe com essa cotação extra na saída de depuração. Basta usar sua variável com aspas duplas em torno dela e você ficará bem.

    
por 18.07.2018 / 09:25
-1

Você deve tentar colocar um sinal $ na frente do seu parâmetro entre aspas, enquanto estiver escapando das aspas internas, assim:

./run.sh name $'--vars="service_name=\'\someothername\'"'

Isso deve funcionar, pois o $ está dizendo ao shell para considerar o conteúdo da string como uma string, para que ela não seja interpretada. E as aspas devem ser escapadas para evitar serem consideradas como citações finais para a string.

(consulte também este post )

    
por 18.07.2018 / 02:31