Zsh de expansão de curinga

2

Estou executando em um servidor em que qstat me fornece os IDs dos trabalhos em execução (detalhes não são importantes). Por exemplo, digamos que eu tenha três trabalhos em execução, 123 , 124 , 125 e, em seguida,

> qstat
123
124
125

Cada trabalho tem um arquivo de log em logs/ . Eu quero tail -F os arquivos de log de todos os trabalhos.

Eu tentei

tail -F $(qstat | awk -v P=logs '{ print P"/*"$1 }' | paste -sd " ")

mas eu recebo

tail: cannot open logs/*123 for reading: No such file or directory

para cada trabalho.

Estou executando zsh , a mesma coisa funciona em bash !

Aparentemente, não há expansão de curinga após $ (...), poderia ser? Como faço para corrigir isso para zsh ?

    
por fabian789 06.09.2018 / 15:16

1 resposta

4

Sim, a expansão do nome do arquivo após a substituição do comando e outras expansões geralmente não são desejadas¹ e não são feitas por padrão no zsh, exceto na emulação sh / ksh ( globsubst option).

Enquanto você poderia usar ${~$(...)} para solicitar o uso de globsusbt para aquela substituição de comando específica (e, a propósito, você não precisa da parte paste , espaço e nova linha estão no valor padrão de $IFS ), uma maneira muito melhor de fazer isso com o zsh seria:

ids=($(qstat))
tail -F logs/*${^ids}

Observe que, se algum desses globs não corresponder a nenhum arquivo, o comando será cancelado.

tail -F logs/*${^ids}(N)

(onde (N) ativa nullglob para essas globs) evitaria isso, mas executaria tail -F sem argumento se não houvesse nenhum arquivo (consulte Por que o nullglob não é padrão? ).

Você também pode fazer isso:

logs=(logs/*${^$(qstat)}(N))
(($#logs)) && tail -F $logs

¹ O fato de que bash e outras shells parecidas com Bourne fazem isso pode ser visto como um bug. Essa é uma das razões por que você precisa citar todas as suas variáveis , ou por que você precisa de set -o noglob antes de usar um $(...) sem aspas quando desejar apenas a divisão essa divisão + glob. Todos os shells mais modernos que não carregam a bagagem do shell Bourne como rc , es ou fish também não fazem isso.

    
por 06.09.2018 / 18:05

Tags