Não é possível definir um alias global em zsh

0

Eu quero definir um alias global que digite um one-liner.

alias -g TLOGS3="\'find /var/log/trafficserver/ -name access.log\* -printf \"%T@ %Tc %p\n\" | sort -n | tail -n 3 | cut -d \" \" -f 9 | tr \"\n\" \" \"\'"

Eu quero digitar isto: -

'find /var/log/trafficserver/ -name access.log\* -printf "%T@ %Tc %p\n" | sort -n | tail -n 3 | cut -d " " -f 9 | tr "\n" " "'

Mas, por algum motivo, quando eu digito (TLOGS3 e barra de espaço) no terminal (zsh shell), eu entendo: -

➜ $?=0 /home/arastogi [10:37AM] % TLOGS3find: '/var/log/trafficserver/': No such file or directory
'find /var/log/trafficserver/ -name access.log\* -printf "%T@ %Tc %p\n" | sort -n | tail -n 3 | cut -d " " -f 9 | tr "\n" " "'

Alguém pode me ajudar com o que está acontecendo?

    
por Abhijeet Rastogi 23.03.2017 / 18:40

1 resposta

0

Na mensagem de erro, parece que o diretório /var/log/trafficserver/ não existe ou pelo menos find não consegue acessá-lo.

E eu acho que a mensagem de erro aparece depois de digitar Espaço porque Espaço está ligado a um widget, que automaticamente tenta expandir aliases. Se o seu alias geralmente for substituído pelo comando completo, esse é definitivamente o caso. Caso contrário, você pode verificar isso com

bindkey " "

Se não houver nenhum widget ligado ao Espaço , isso deve ser mostrado

" " self-insert

Também pode ser exibido

" " magic-space

Este é um widget interno que expande as referências do histórico (como !! ) antes de inserir um espaço. Mas isso não afeta os aliases.

Se mostrar mais alguma coisa, é mais provável que o widget que expande o alias. É claro que o problema subjacente ainda é que o diretório não existe ou está inacessível.

Além disso, o alias parece estar bem e funciona para mim, embora eu tenha que alterar -f 9 para -f 8 , já que o achado só retorna oito campos para mim, provavelmente devido a diferentes configurações de localidade. Mas sugiro usar os qualificadores glob de zsh para conseguir o mesmo de uma maneira menos complicada:

alias -g TLOGS3='/var/log/trafficserver/**/access.log*(Om[-3, -1])'

Isso se expande para uma lista de arquivos em /var/log/trafficserver ou qualquer um de seus subdiretórios ( ** ), correspondendo ao nome access.log* . Esta lista é ordenada descendente ( O ) por hora de modificação ( m ; última modificação primeiro) e limitada ao terceiro último ao último elemento ( [-3,-1] ).

Se não houver subdiretórios e a ordem dos arquivos puder ser revertida, isso pode ser encurtado para

alias -g TLOGS3='/var/log/trafficserver/access.log*(om[1,3])'

o ordens ascendentes, portanto, os elementos do primeiro ao terceiro são os três mais recentes.

    
por 27.03.2017 / 13:59

Tags