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: