Command-Line
rlwrap -z 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>
。如何使用through
rlwrap -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 本身不會做任何黑魔法,它應該起作用。