Construir comando para o bash exec

1

Eu tenho um script de shell que executa exec para substituir a si mesmo por outro comando. O outro comando leva alguns argumentos opcionais.

exec mycommand $ARG1 $ARG2 $ARG3

Qualquer um desses argumentos pode ser preenchido ou não preenchido. Se eles não estiverem preenchidos, eles não serão renderizados como um argumento para a função. Por exemplo:

# if you have:
ARG1=foo
ARG3=bar
exec mycommand $ARG1 $ARG2 $ARG3
# then you get:
exec mycommand foo bar

No entanto, quero espaços para ser legal nos valores para esses argumentos e para isso não causar-lhes para produzir argumentos adicionais. Isto é,

# if you have
ARG1="foo bar baz"
ARG2="qux"
exec mycommand $ARG1 $ARG2 $ARG3
# then I want:
exec mycommand "foo bar baz" qux
# not:
exec mycommand foo bar baz qux

Eu tentei colocar aspas com escape nos argumentos, mas exec esperava que elas literalmente fizessem parte do valor.

ARG1="\"foo bar baz\""
exec mycommand $ARG1 $ARG2 $ARG3
# gives you:
exec mycommand \"foo bar baz\"

Eu também tentei citar as variáveis em exec, mas depois ele passou a passar strings vazias quando os argumentos não estavam presentes:

ARG2="foo bar"
exec mycommand "$ARG1" "$ARG2" "$ARG3"
# gives you:
exec mycommand "" "foo bar" ""

Existe uma maneira melhor de construir um comando e passá-lo para exec? Existe outra maneira de substituir o processo atual por outro?

    
por Nick Retallack 26.06.2015 / 20:35

1 resposta

1

Com o bash, você usa uma matriz e todas as variáveis devem ser citadas corretamente:

ARG1="foo bar baz"
ARG3="qux"

cmd=( mycmd )

[[ -n "$ARG1" ]] && cmd+=( "$ARG1" )
[[ -n "$ARG2" ]] && cmd+=( "$ARG2" )
[[ -n "$ARG3" ]] && cmd+=( "$ARG3" )

printf "%s\n" "${cmd[@]}"
#exec "${cmd[@]}"

Isso lhe dará a chamada desejada: exec mycommand "foo bar baz" qux sem argumentos "string vazia". Remova a linha printf e remova o comentário da linha exec, se estiver satisfeito com o funcionamento dela.

    
por 26.06.2015 / 21:05