Em shells normais no estilo Bourne, como Bourne shell, dash, ksh e bash, a sintaxe $variable
significa “pegar o valor da variável, dividi-la em palavras separadas onde os caracteres de IFS
aparecem e tratar cada palavra como um padrão curinga de nome de arquivo e expandi-lo se corresponder a um ou mais arquivos ”. Se variable
for uma matriz, isso acontece com o primeiro elemento da matriz e os outros elementos são ignorados.
Em zsh, a sintaxe $variable
significa "pegar o valor da variável, exceto removê-lo se estiver vazio". Se variable
for uma matriz, isso acontece com todos os elementos da matriz. Os entusiastas de Zsh consideram a maneira zsh superior.
Em zsh, você pode escrever $=variable
para realizar a divisão de palavras. Esta não é a melhor maneira de fazer o que você está fazendo, no entanto. Sua função bash não suporta espaços em branco em nomes de arquivos, e usar $=variable
em zsh também não. Aqui está uma maneira diferente de analisar o argumento que funciona tanto no bash quanto no zsh e lida com qualquer caractere, exceto :
em um nome de arquivo. Se o argumento contiver dois dois-pontos, tudo após o primeiro cólon será removido e a parte entre o primeiro cólon e o segundo cólon será anexada como um argumento separado precedido por um sinal +
. É um pouco mais longo que o seu código, mas menos difícil de entender, e não engasga na primeira dica de um espaço em um nome de arquivo.
vl () {
local suffix
case $1 in
*:*:*) suffix=${1#*:};; set -- "${1%%:*}" "+${suffix%%:*}";;
esac
vim "$@"
}