Como manipular a variável awk NF em zsh?

1

Eu tenho uma linha de comando simples:

uptime | awk '{print $(NF - 2)}'

Em um bash shell, isso funciona sem problemas, mas quando eu o executo no zsh, recebo o seguinte erro:

title:5: command not found: NF

Como de costume, isso será um erro do piloto (não estou falando de como a expansão funciona no zsh), mas não consigo descobrir o que fazer para que o mesmo comando funcione no zsh.

[Editar]

A versão do zsh é 4.3.11 no OSX, e a saída do set -xv; uptime | awk '{print $(NF - 2)}' é:

$ set -xv; uptime | awk '{print $(NF - 2)}'
title:5: command not found: NF
+zsh:3> uptime
+zsh:3> awk '{print $(NF - 2)}'
0.51
+precmd:1> title '%15<..<%~%<<' '%n@%m: %~'                                                                           
+title:1> [ '' '!=' true ']'
+title:2> [[ xterm-256color == screen* ]]
+title:4> [[ xterm-256color == xterm* ]]
+title:5> print -Pn '\e]2;%n@%m:\ %~\a'
+title:6> print -Pn '\e]1;%15\<..\<%~%\<\<\a'
+zsh:4> git_prompt_info
+git_prompt_info:1> ref=+git_prompt_info:1> ref='' 
+git_prompt_info:1> return
+zsh:4> vi_mode_prompt_info
+vi_mode_prompt_info:1> echo ''

Então, aparentemente, o comando awk funciona, mas minha customização de terminal é executada.

    
por helgeg 13.09.2011 / 12:12

1 resposta

5

title:5: command not found: NF

Esta mensagem de erro mostra um erro em uma função chamada title , que pelo nome presumivelmente define o título do seu terminal para o comando que está sendo executado. A transcrição subsequente mostra title sendo chamado por precmd , que é chamado quando um comando terminou a execução, logo antes de mostrar o próximo prompt. Mas o erro é, na verdade, acionado por preexec , chamado antes de executar um comando. Essa função é definida no seu ~/.zshrc (ou talvez /etc/zshrc , ou em um arquivo que qualquer uma delas chama).

Eu não posso dizer exatamente o que está errado sem ver o código, mas parece que a cadeia de comando está sendo expandida de alguma forma. Talvez você tenha a opção prompt_subst definida e esteja imprimindo o comando por meio de print -P ? Você precisa escapar do comando. Em particular, não imprima através de print -P , imprima através de print -r e cuide dos caracteres de controle literais. Algo como:

print -r ${${${${(qqqq)1}#\$\'}%\'}//\\'/'}
    
por 14.09.2011 / 00:20

Tags