rlwrap -z pipeto: saída de tubulação através de pagers

5

Estou usando rlwrap para colorir o prompt no asterisco CLI :

rlwrap -s 99999 -a -pRED /usr/sbin/asterisk -r

Eu li em man rlwrap que também posso usar

rlwrap -z pipeto

para enviar saída por meio de um colorizador. Eu tenho grc colorizer que funciona assim:

cat foo | grcat <conf_file>

Os exemplos acima colorem foo usando as regras de <conf_file> .

Como posso usar rlwrap -z pipeto para colorir a saída de rlwrap a grcat ?

    
por Martin Vegter 11.03.2015 / 23:20

1 resposta

5

pipeto

Infelizmente, o filtro interno rlwrap pipeto não filtra a saída da maneira desejada. Eu acho a documentação bastante enganosa, mas o que acontece é se você executa rlwrap -z pipeto some-shell , então, dentro da interação:

  • se você digitar comandos sem nenhum sinal de pipe ( | ), eles serão passados textualmente para some-shell e, em seguida, a saída será simplesmente impressa;

  • se você digitar command | filter , então command será passado para some-shell para interpretar e a saída será canalizada por filter antes de ser impressa (onde filter é qualquer comando que você possa executar a partir da linha de comando no seu shell Unix).

Portanto, a boa notícia é que você pode obter o comportamento que está procurando, por exemplo, executando rlwrap -z pipeto asterisk e depois lembrando de acrescentar | grc a cada comando que deseja passar para um asterisco. Mas isso não seria muito conveniente, seria? Daí outfilter .

outfilter

Sugiro criar o seguinte script de filtro rlwrap :

#! /usr/bin/perl
use lib ($ENV{RLWRAP_FILTERDIR} or ".");
use RlwrapFilter;
use strict;

my $filter = new RlwrapFilter;
my $name = $filter->name;

my $filter_command = join ' ', @ARGV;

$filter->help_text("Usage: rlwrap -z '$name <filter-command>' <command>\n"
                   . "Filter <command> output through <filter-command>");

$filter->output_handler(sub {""});
$filter->prompt_handler(\&prompt);
$filter->run;

sub prompt {
    my $prompt = shift;

    my $output = $filter->cumulative_output;
    $output =~ s/\r//g;

    open (PIPE, "| $filter_command")
        or die "Failed to create pipe: $!";
    print PIPE $output;
    close PIPE;

    return $prompt;
}

Salve-o como outfilter , torne-o executável e execute rlwrap -z './outfilter <coloring-filter>' shell . Eu tentei com:

rlwrap -z './outfilter ccze -A' gosh

que bem colore a saída de Gauche. No seu caso, isso se tornaria algo como:

rlwrap -z './outfilter grcat grcat-config' asterisk

Se você gosta do filtro e quer ser capaz de rodá-lo sem ter que especificar seu caminho, você pode movê-lo ao lado dos filtros incorporados (no meu sistema, que está no diretório /usr/share/rlwrap/filters ).

Note que o filtro como escrito é provavelmente ineficiente (ele gera uma nova cópia do filtro de coloração para cada interação com o shell de comando, porque é o caminho mais curto que eu poderia encontrar para liberar seus buffers) e frágil, mas se a concha com a qual você está interagindo não faz nenhuma magia negra, deve funcionar.

    
por 19.03.2015 / 05:59