Gerando parte aninhada de um padrão glob usando substituição de comando

1

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 substituição de comando; Estou usando echoaqui apenas para ilustrar para onde estou indo; em um exemplo do "mundo real", isso certamente seria algum programa:

echo $(echo '(xx|yy|zz)')*.txt  # Example 2

Isso funcionaria como acima. Agora vem a parte complicada: A substituição de 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. Eu acho que o Zsh está procurando por arquivos começando literalmente por xx|yyaqui.

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?

user1934428
fonte

Respostas:

2

Apenas use:

echo (${~"$(echo 'xx|yy')"}|zz)*.txt

Observe as aspas em torno da substituição de comando, zshassim como realiza a divisão de palavras, se não estiver oculto por padrão na substituição de comando, o que pode ser útil em coisas como:

echo (${~${(j:|:)$(cmd)}}).txt

juntar as palavras na saída de cmdwith |e interpretá-lo como um globo. Consulte também o bsinalizador de expansão de parâmetro se você não quiser que essas palavras sejam tratadas como padrões:

echo (${~${(j:|:)${(b)$(cmd)}}}).txt
Stéphane Chazelas
fonte