我用来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
的输出进行着色?rlwrap
grcat
答案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正在交互本身不会产生任何黑魔法,它应该起作用。