No zsh, como posso ativar o Extended_glob inline em um glob de geração de nome de arquivo?
Digamos que eu queira executar ls
em todos os caminhos não nomeados a
, o que pode ser feito por meio de:
setopt -o extendedglob
ls ^a
Mas existe alguma maneira de ativar o extended_glob para o glob de geração de nome de arquivo acima sem usar setopt -o extendedglob
?
Eu sei que posso usar o (*)
sinalizador de expansão de parâmetro para ativar o Extended_glob inline (sem usar setopt -o extendedglob
) para expansões de parâmetros regex como:
printf $'%s\n' "${(*)x#^a}"
Basta ativar
extended_glob
. Não consigo pensar em uma razão para não fazer isso.A única razão
extended_glob
pela qual está desativado por padrão é porque a configuração padrão é compatível com versões anteriores e isso remonta a antes deextended_glob
existir. Isso não muda o comportamento de muitas coisas que você provavelmente escreverá. A única coisa que encontro na prática é que ocasionalmente preciso citar um^
ou#
em um argumento de comando, mas isso é menos comum do que querer usar^
ou#
como curinga.Se você quiser evitar alterar as opções no código, torne as opções locais. Você precisa fazer isso de qualquer maneira em funções que podem ser executadas em um contexto não especificado. Chame
emulate -L
para definir as opções relacionadas ao script para seu valor padrão durante a execução da função e restaurá-las quando a função retornar.Se quiser alterar a configuração apenas para uma linha de código, você pode colocá-la em uma função anônima.
A propósito, atualmente o
*
sinalizador de expansão de parâmetro não ajuda porque afeta apenas substituições, não a geração de nomes de arquivos (mas afetar a geração de nomes de arquivos seria um recurso útil). Você pode expandir um glob dentro de uma substituição de parâmetro com o formulário, que permite que o nome seja omitido, combinado com o formulário, por exemplo, para listar arquivos cujo nome não começa com . Mas não funciona a menos que já esteja habilitado, porque (atualmente) não tem efeito no globbing induzido por .${name:-word}
${~spec}
echo ${~:-[^a]*}
a
echo ${(*)~:-^a*}
extended_glob
*
glob_subst
Um truque (feio) se você quiser manter-
extendedglob
se desativado seria fazer:Em seguida, use
#x
para ativarextendedglob
os seguintes argumentos até#X
desativá-lo: