rlwrap -z pipeto: sortie de la tuyauterie via les téléavertisseurs

J'utilise rlwrap pour coloriser l'invite dans l'astérisque CLI :

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

Je lis dans l' man rlwrap que je peux aussi utiliser

 rlwrap -z pipeto 

pour canaliser la sortie à travers un coloriseur. J'ai un coloriseur grc qui fonctionne comme ceci:

 cat foo | grcat <conf_file> 

Les exemples ci-dessus colorisent foo utilisant les règles de <conf_file> .

Comment puis-je utiliser rlwrap -z pipeto pour coloriser la sortie de rlwrap via grcat ?

pipeto

Malheureusement, la rlwrap filter pipeto ne filter pas la sortie comme vous le souhaitez. Je trouve la documentation plutôt trompeuse, mais ce qu'il fait est si vous exécutez rlwrap -z pipeto some-shell , puis, dans l'interaction:

  • si vous tapez des commands sans signe de pipe ( | ), celles-ci sont transmises textuellement à some-shell et la sortie de celle-ci est simplement imprimée;

  • si vous tapez command | filter command | filter , puis la command est transmise à some-shell pour l'interpréter, et la sortie de celle-ci passe par le filter avant d'être imprimée (où filter est une command que vous pouvez exécuter à partir de la command line de votre shell Unix).

Donc, les bonnes nouvelles sont que vous pouvez get le comportement que vous cherchez, kindof, sortof, en exécutant rlwrap -z pipeto asterisk et puis se callbacker d'append | grc | grc à chaque command que vous voulez transmettre à l'astérisque. Mais ce ne serait pas très pratique, n'est-ce pas? Par conséquent, le outfilter .

outfilter

Je suggère de créer le script de filter rlwrap suivant:

 #! /usr/bin/perl use lib ($ENV{RLWRAP_FILTERDIR} or "."); use RlwrapFilter; use ssortingct; 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; } 

Enregistrez-le en tant que outfilter , rendez-le exécutable, puis exécutez le rlwrap -z './outfilter <coloring-filter>' shell . J'ai essayé avec:

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

qui colore bien la sortie de Gauche. Dans votre cas, cela deviendrait quelque chose comme:

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

Si vous aimez le filter et voulez pouvoir l'exécuter sans avoir à spécifier son path, vous pouvez le déplacer à côté des filters embeddeds (sur mon système, dans le directory /usr/share/rlwrap/filters ).

Notez que le filter tel qu'il est écrit est probablement inefficace (il génère une nouvelle copy du filter de coloration pour chaque interaction avec le shell de command, car c'est le plus court moyen pour le faire vider ses tampons) et fragile, mais si le shell interagissent avec ne fait pas de magie noire, il devrait fonctionner.