Passe $ @ para o comando, preservando aspas

0

Estou tentando alterar o comportamento de git , usando a abordagem descrita aqui , mas estou com dificuldades como passar corretamente o conteúdo de $@ sem perder as aspas da entrada original.

Basicamente, eu tenho isso:

# foo.sh

#!/bin/bash
cmd=$1
shift
args=$@
if [ $cmd == "bar" ]; then args=('--baz' "${args[@]}"); fi
echo git $cmd ${args[@]}

Mas quando executo ./foo.sh bar -a "one two three" , ele gera (e, portanto, seria executado), ./foo.sh bar --baz -a one two , em vez de ./foo.sh bar --baz -a "one two" , como seria necessário.

Não consigo descobrir como transmitir corretamente $@ para outro comando e preservar argumentos citados. É possível? Como?

    
por Tomas Aschan 01.10.2018 / 16:43

1 resposta

7

Ao usar "${args[@]}" , você assume que args é uma matriz, mas não é.

Para que args seja uma matriz, você deve atribuir a ela uma atribuição de matriz, como

args=( "$@" )

Para que os elementos da matriz sejam citados individualmente quando você expande ${args[@]} , é necessário colocar aspas duplas na expansão (assim como com "$@" ):

echo git "$cmd" "${args[@]}"

Neste exemplo simples, a matriz args separada não é realmente necessária:

#!/bin/sh

cmd=$1
shift

if [ "$cmd" = "bar" ]; then
   set -- --baz "$@"
fi

echo git "$cmd" "$@"

Observe que as citações não serão geradas pelo comando echo acima. Mas você pode ter certeza de que echo obtém exatamente dois argumentos ( git e $cmd ), mas no entanto, muitas coisas estão em $@ nesse ponto. Isso ocorre porque o shell cota a remoção no comando antes de executá-lo. Você pode comparar isso com o que, por exemplo echo "one two" three de saídas.

Uma maneira melhor de gerar o comando para inspeção visual talvez seja

printf 'Arg: %s\n' git "$cmd" "$@"

Isto imprimiria cada argumento separado para printf em sua própria linha (prefixado pela string Arg: ).

Seu comando git , git "$cmd" "$@" (ou git "$cmd" "${args[@]}" se você usar uma matriz separada) seria executado corretamente (considerando que as variáveis fazem sentido, o% comumgit não tem bar sub- comando com uma opção --baz , por exemplo).

Relacionados:

por 01.10.2018 / 16:59

Tags