pipeto

pipeto

我用来rlwrap对星号中的提示进行着色CLI

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

我读到man rlwrap我也可以使用

rlwrap -z pipeto

通过着色器管道输出。我有grc着色器,其工作原理如下:

cat foo | grcat <conf_file>

上面的示例foo使用来自 的规则进行着色<conf_file>

如何使用对throughrlwrap -z pipeto的输出进行着色?rlwrapgrcat

答案1

pipeto

不幸的是,rlwrap的内置过滤器pipeto不能按照您想要的方式过滤输出。我发现文档相当具有误导性,但它的作用是如果您rlwrap -z pipeto some-shell在交互中运行 , then :

  • 如果您键入不带任何管道符号 ( |) 的命令,这些命令将被逐字传递some-shell,然后简单地打印其输出;

  • 如果您键入command | filter,则将command传递给some-shell解释器,并且其输出filter在打印之前通过管道传输(其中filter是您可以从 Unix shell 中的命令行运行的任何命令)。

rlwrap -z pipeto asterisk因此,好消息是,您可以通过运行然后记住附加到| grc要传递给星号的每个命令来获得您正在寻找的行为。但这不太方便,不是吗?因此outfilter

outfilter

我建议创建以下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;
}

将其另存为outfilter,使其可执行,然后运行rlwrap -z './outfilter <coloring-filter>' shell​​。我尝试过:

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

这很好地为 Gauche 的输出着色。在你的情况下,这会变成这样:

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

如果您喜欢该过滤器并且希望能够运行它而无需指定其路径,则可以将其与内置过滤器一起移动(在我的系统上,位于目录中/usr/share/rlwrap/filters)。

请注意,编写的过滤器可能效率低下(它会为与命令 shell 的每次交互生成着色过滤器的新副本,因为这是我能找到的让它刷新缓冲区的最短方法)并且脆弱,但是如果 shell正在交互本身不会产生任何黑魔法,它应该起作用。

相关内容