Estou tendo problemas com a correspondência de padrões na função de gancho do zsh precmd
. Eu tenho o seguinte:
precmd(){
local x='test'
if [ $x = '*test*' ]; then
echo 'hello'
fi
}
que não imprime olá nunca. Eu testei este código com um normal zsh test.zsh
que funciona bem, e tentei sem o regex precmd
e consegui imprimir as coisas bem também. Alguma pista de por que isso não está funcionando como esperado?
$ zsh --version
zsh 4.3.11 RHEL
[ $x = '*test*' ]
testa se a string resultante da expansão$x
, que étext
, é igual à string resultante da expansão'*test*'
, que é*text*
.Para testar se o valor da variável
x
corresponde ao padrão*test*
, você precisa usar o operador=
ou das expressões condicionais zsh , que são escritas entre colchetes duplos . Além disso, os caracteres especiais no padrão devem ser sem aspas, caso contrário, eles representam por si mesmos. Desta forma:==
[[ … ]]
A sintaxe de expressões condicionais é semelhante à sintaxe de expressões que você pode usar entre colchetes simples
[ … ]
, mas não idêntica.[
é analisado como um comando comum; na verdade, é um comando interno com um nome de um caractere, que é idêntico aotest
interno , exceto que[
requer um argumento adicional no final, que deve ser]
.[[ … ]]
é uma construção gramatical distinta, que permite ter caracteres especiais de shell dentro.[ $x = *test* ]
expandiria*test*
para a lista de nomes de arquivos correspondentes (globbing) e otest
builtin acabaria analisando o resultado disso.[[ $x = *test* ]]
analisa*test*
como parte da análise de expressão condicional que não invoca globbing.*test*
não é um padrão regex válido. O*
é um operador de repetição e precisa de algo para repetir. É muito provável que você queira.*test.*
, embora isso não seja necessário com o regex, pois ele não está ancorado por padrão. Você poderia apenas procurartest
No entanto, você não pode combinar padrões regex com o
=
operador, você precisa do=~
.