ZSH, concatena passado em argumentos em uma única string

0

Eu gostaria de criar uma função bash simples para usar para minha conveniência. Seguindo a resposta dada em: Unindo argumentos bash em uma única string com espaços Eu consegui misturar esse pequeno código:

function gcm {
  msg="'$*'"
  eval "git commit -m ${msg}"
}

Agora, este exemplo é muito conveniente para enviar mensagens como "Olá, sou eu" (simples conjunto de caracteres de palavras), mas quando eu não quiser uma mensagem de commit como: "[WIP] Halfway trough code". , Recebo uma mensagem de erro da seguinte forma: zsh: no matches found: [WIP]

Por favor, esclareça por mim o que está acontecendo em segundo plano e por que esse fragmento falha?

    
por 33windowlicker 04.04.2016 / 20:46

1 resposta

2

O ZSH é deliciosamente livre do comportamento de divisão de palavras visto em outros shells (a menos que por alguma razão bizarra a opção SH_WORD_SPLIT tenha sido ativada), então não há necessidade de usar construções estranhas de aspas duplas.

% (){ print -l $* } a b c  
a
b
c
% (){ print -l "$*" } a b c
a b c
% (){ local msg; msg="$*"; print -l $msg } a b c
a b c
% 

Assim, o seguinte deve ser suficiente:

function gcm {
  local msg
  msg="$*"
  git commit -m $msg
}

A globalização pode ser desativada citando strings como [WIP] as '[WIP]' ou talvez por meio de% al_de% alias:

% function blah { print -l "$*" }
% alias blah='noglob blah'
% blah [de] *blah*
[de] *blah*
% 
    
por 04.04.2016 / 21:27