Escape shell arg de um script para outro

0

Dada ./mysh0 :

#!/bin/bash

exec ./mysh1 $*

e ./mysh1 :

#!/bin/bash

echo $1
echo $2
echo $3

Como faço para chamar mysh0 de forma que os argumentos para mysh1 e o que é impresso sejam "A", "B 2" e "C"?

Chamar isso como ./mysh0 A "B 2" C não funciona.

    
por jvliwanag 10.12.2015 / 04:14

1 resposta

3

Você deve usar "$@" em vez de $* :

exec ./mysh1 "$@"

Esse é o caminho certo para expandir todos os argumentos posicionais como palavras separadas.

Quando você usa $* , todos os argumentos posicionais foram concatenados em uma cadeia longa, com o primeiro valor de IFS como separador, que é o padrão para um espaço em branco, você obteve A B 2 C .

Agora, porque você usa $* sem as aspas duplas (o que pode levar a implicações de segurança e faça seu script engasgar ), o shell executará split+glob nele. A longa string que você obteve acima foi dividida em quatro palavras, A , B , 2 e C .

Portanto, você passou quatro argumentos para mysh1 em vez de três.

    
por 10.12.2015 / 05:16