Linux equivalente ao utilitário vis (1) do BSD

2

Eu tenho um monte de zsh de scripts para tarefas baseadas em cli, e desenvolvi a maioria deles no FreeBSD e no MacOS (Ambos os sabores BSD Unix)

Ultimamente, tenho usado o Ubuntu e percebi que alguns dos meus scripts estavam quebrados. Um dos poucos scripts que ainda tenho que corrigir depende de vis(1) , um utilitário comum para converter caracteres não imprimíveis em seu equivalente "visível". v.gr BELL caracteres tornam-se agradáveis ^G s, unsightly " escapa " tornam-se \e após echo ing e passam por vis .

É muito útil ao depurar a saída de tela que, de outra forma, iria atrapalhar ou até bloquear a tela.

Normalmente, quando não é instalado com o sistema básico como é o caso no FreeBSD, vis(1) vem incluído nos pacotes terminfo, como é o caso do MacOS, onde está disponível mesmo em homebrews.

no entanto não consigo encontrá-lo no Linux ou nos pacotes terminfo para minha distribuição. De fato, vis(1) parece ser algum tipo de vi clone no Ubuntu !.

A coisa mais próxima que eu encontrei foi no pacote libbsd-dev , no entanto este pacote inclui apenas a biblioteca, a página man e as definições de cabeçalho C vis.h para as chamadas do sistema strvis(3) e strunvis(3) .

Existe um utilitário com funcionalidade semelhante disponível no linux? qual pacote devo instalar para obtê-lo; preferencialmente para o Ubuntu?

    
por hlecuanda 12.02.2018 / 11:33

2 respostas

1

Como se constata, há uma solução 100% portátil, com a vantagem adicional de não depender de nenhum utilitário externo ao sabor dos empacotadores e mantenedores!

Depois de arranhar a superfície das gigantescas páginas zsh man, encontrei uma característica obscura e provavelmente pouco conhecida.

Portanto, temos expansão de chave para variáveis (ou parâmetros em zsh -speak). Acontece que há um monte de sinalizadores que você pode usar ao fazer a expansão de chaves de uma variável. e coisas notavelmente úteis podem ser feitas com tais bandeiras. Portanto, se eu armazenar unsightly apnd potencialmente termcaps de bloqueio de terminal em uma variável, tudo que eu tenho que fazer é usar o (V) flag quando echo ing print ing ou em algum momento enquanto assgning para uma nova variável. e terá exatamente o mesmo efeito que o utilitário vis(1) acima mencionado. Internamente, na verdade, é strvis(3) reimplementado. então minha solução foi esta:

zmodload zsh/terminfo

typeset terminal_reset_sequence=$terminfo['rs2'] #toxic! locks terminal if echoed!
echo ${(V)terminal_reset_sequence} # Perfectly safe like piping trough vis(1)

como bônus, encontrei os sinalizadores (Q) e (z) , que farão a cotação correta do shell ( (Q) ) em qualquer sequência contendo barras, oitavas, aspas simples e duplas. Magicamente torna-os seguros para shell, enquanto (z) se eu entendi corretamente, irá " descascar " um nível de citação de uma maneira segura em shell em qualquer string entre aspas aninhadas. Gostaria de saber sobre estes dois anos atrás! : C

    
por 12.02.2018 / 20:39
2

GNU coreutils ' cat tem essa função (infame) embutida - se você não se importa em quebrar o UTF-8:

cat -v

Existe uma função semelhante em sed , embora também dobre linhas para 80 bytes:

sed -n l

Algo mais portátil seria:

perl -p -e 's/[^\t\n\x20-\xFF]/sprintf("\x%02X", ord($&))/ge'

Acho que isso seria melhor para o Unicode:

perl -C -p -e 's/[^\n\P{Other}]/sprintf("\x{%04X}", ord($&))/ge'
    
por 12.02.2018 / 13:16