Tentando criar uma função bash que coleta e cita todos os argumentos, mas não funciona se os argumentos contiverem colchetes ou aspas simples

2

Eu vi o seguinte atalho para "git commit" sugerido em algum lugar:

function gc {
  git commit -m "$*"
}

Isto supostamente permite que você escreva a mensagem de commit inline no shell, sem aspas ou qualquer coisa. Como:

gc This is a commit message

O problema é que ele não parece funcionar se a própria mensagem de confirmação contiver colchetes ou aspas. (E eu uso um monte de parênteses / citações nas minhas mensagens de commit.) Alguém bem versado na arte do script do bash sugere um atalho melhor?

    
por Alex D 14.02.2013 / 22:08

1 resposta

3

Eu não acho que isso seja um problema com sua função (ou, mais precisamente, eu não acho que isso seja um problema que você possa resolver em sua função). O bash analisa a linha de comando (incluindo a interpretação de strings entre aspas, várias expressões de colchetes, etc) antes de chamar sua função - antes mesmo que decida chamar sua função . Portanto, quando você digitar algo como gc fixed Greg's bug , o bash exigirá que você feche a string entre aspas antes de executar a função; quando você digita gc printf("%s", integervar) not a good idea , o bash se queixa dos parênteses e nunca chega ao ponto de decidir qual comando / função / o que quer que esteja sendo solicitado.

Eu presumo que o ponto de usar $* foi evitar ter que citar o memorando na linha de comando, mas isso apenas evita ter que citar espaços na mensagem. Se a mensagem contiver outros metacaracteres de shell, você deverá citar ou escapar adequadamente:

gc "fixed Greg's bug"
gc 'printf("%s", integervar) not a good idea'
gc 'fixed this & deferred that'
    
por 15.02.2013 / 02:48

Tags