Command-Line

rlwrap -z pipeto:通過尋呼機管道輸出

  • March 19, 2015

我正在用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

pipeto

不幸的是,rlwrap的內置過濾器pipeto不會按照您想要的方式過濾輸出。我發現文件相當具有誤導性,但是如果您rlwrap -z pipeto some-shell在互動中執行,那麼它的作用是:

  • 如果您鍵入沒有任何管道符號 ( |) 的命令,這些命令將逐字傳遞給some-shell,然後簡單地列印輸出;
  • 如果您鍵入command | filter,則將command其傳遞給解釋,並在列印之前將some-shell其輸出通過管道傳輸(您可以從 Unix shell 的命令行執行的任何命令在哪裡)。filter``filter

所以好消息是你可以得到你正在尋找的行為,kindof,sortof,通過執行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

如果您喜歡過濾器並且希望能夠在不指定其路徑的情況下執行它,您可以將它與內置過濾器一起移動(在我的系統上,它位於 directory 中/usr/share/rlwrap/filters)。

請注意,編寫的過濾器可能效率低下(它為與命令外殼的每次互動生成一個新的著色過濾器副本,因為這是我能找到的讓它刷新其緩衝區的最短方法)並且脆弱,但如果外殼你are interacting 本身不會做任何黑魔法,它應該起作用。

引用自:https://unix.stackexchange.com/questions/189623