Stringify comando bash da matriz de argumentos para uso em “bash -c”

1

Gostaria de restringir um dado comando, dado como um array.

Isso seria útil, por exemplo, para colocar um comando dentro de um bash -c .

Por exemplo:

cmd=(
  "printf '%s\n'"
  "foo bar"
  "baz bang"
)

stringified="$(transform "${cmd[@]}")"

De modo que: "${cmd[@]}" e bash -c "$stringified" dariam exatamente a mesma saída para qualquer matriz cmd.

No meu exemplo, isso seria:

$ "${cmd[@]}"
foo bar
baz bang

O valor de stringified="printf \"%s\n\" \"foo bar\" \"baz bang\"" funciona para o meu caso, mas desejo ter uma função de transformação que escape desses argumentos para mim.

De preferência, eu preferiria uma solução bash, ou se esse não é o caso, com ferramentas que normalmente já estão instaladas em uma distribuição linux (printf, echo).

    
por edi9999 15.10.2018 / 14:08

1 resposta

1

Eu encontrei uma boa solução para isso (acho que funcionaria para qualquer array de entrada), ele usa o recurso printf "%q" .

Você pode escrever:

cmd=(
  "printf '%s\n'"
  "foo bar"
  "baz bang"
)

stringified="$(printf "%q " "${cmd[@]}")"

Isso dá:

printf\ \'%s\n\' foo\ bar baz\ bang

Explicação

O comando printf "% q" escapa caracteres a serem usados no shell:

%q ARGUMENT is printed in a format that can be reused as shell input, escaping non-printable characters with the proposed POSIX $'' syntax.

Source : man printf

Ao usar "%q " , todos os elementos na matriz são impressos e com escape correto e, como há um espaço após o %q , todos os elementos serão delimitados por um espaço.

    
por 15.10.2018 / 14:40