Vamos começar com um exemplo simples de geração de nome de arquivo:
echo (xx|yy|zz)*.txt # Example 1
Isso lista todos os arquivos txt começando com xx ou yy ou zz. Agora vamos gerar essas alternativas dinamicamente usando a substituição de comandos; Estou usando echo
aqui apenas para ilustração de onde estou indo; em um exemplo do "mundo real", isso seria, obviamente, algum programa:
echo $(echo '(xx|yy|zz)')*.txt # Example 2
Isso funcionaria como acima. Agora vem a parte complicada: A substituição do comando deve fornecer apenas PARTE da lista de alternativas:
echo ($(echo 'xx|yy')|zz)*.txt # Example 3 (does not work)
Isso não funcionaria mais: encontraria arquivos começando com zz, mas não aqueles com yy. Acho que o Zsh está procurando por arquivos começando literalmente com xx|yy
aqui.
Podemos fazê-lo funcionar, se usarmos uma variável auxiliar:
list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt # Example 4
Agora a minha pergunta:
É possível obter o efeito do exemplo 4, sem usar uma variável temporária?
Apenas use:
Observe as aspas em torno da substituição do comando, pois
zsh
executa a divisão de palavras, se não globbing por padrão na substituição do comando, o que pode ser útil em coisas como:para juntar as palavras na saída de
cmd
with|
e interpretá-lo como um glob. Veja também ob
sinalizador de expansão de parâmetro se você não quiser que essas palavras sejam tratadas como padrões: