Quando você coloca aspas duplas ao redor de expansão , como o $* , o texto expandido não está sujeito a divisão de palavras . (Essa é uma das razões para usar aspas duplas em torno de $ expansões; a outra é evitar globbing .) Além disso, dentro de aspas duplas, aspas simples não são tratados especialmente, por isso não fazem citações e não são removidos .
Então, como Michael Homer diz: , você pode apenas omitir as espúrias ' ' marks e sua função deve funcionar. Eu sugiro escrever assim:
gac() {
git add .
git commit -m "$*"
}
Você pode usar a palavra-chave function para definir funções no Bash, mas a sintaxe mostrada acima funciona tão bem quanto é portátil em shells ao estilo Bourne.
Para abordar o problema conceitual aqui mais diretamente, esta linha em seu código original mostra que você queria expandir um parâmetro cujo valor continha espaços, de forma que você pudesse passá-lo como um único argumento para git :
concatenated="'$*'"
Quando você escreve um único argumento que contém espaços, você cita os espaços, geralmente com aspas ao redor da string inteira. A presença de ' ' dentro da " " nessa linha indica que você estava tentando incluir as aspas que você normalmente digitaria.
O motivo pelo qual essa abordagem não funciona é que o próprio shell é o que interpreta suas aspas; eles normalmente não significam nada para o comando executado a partir do shell . Suponha que você tenha o comando:
some-command 'foo bar' baz
Esse comando não transmite aspas para o comando some-command . Em vez disso, ele executa some-command com foo bar como argumento 1 e baz como argumento 2. (Há também um argumento 0, que diz ao programa como ele foi executado; o shell passa some-command para isso.)
O uso de citações permite que você informe o shell onde os argumentos começam e terminam. Normalmente, os espaços informam ao shell para realizar a divisão de palavras, mas você deseja suprimir o significado especial dos espaços para o shell, que é o que a citação faz. Quando as aspas são citadas, como o interior ' ' dentro de " " , isso também remove o seu significado especial their . Então eles não fazem citações, mas são literalmente passados ao seu comando, como git mostrou em seu log:
a382806 'one two three'