rlwrap-z pipeto: передача по каналу вывода через пейджеры

Вы не "устанавливаете" приложения как это на Linux (кроме некоторых угловых случаев). Используйте свой диспетчер пакетов распределения для установки то, в чем Вы нуждаетесь - он автоматически вытянет в требуемых пакетах всего th. В случае SUSE Linux получил дистрибутивы (так как Вы используете /suse тег) использование

zypper in dialog

(in коротко для install) или

yast -i

который должен дать Вам интерактивные диалоги. Очевидно, необходимо выполнить их с полномочиями пользователя root смочь изменить корневую файловую систему. Если у Вас уже есть распределение RPMs под рукой, можно использовать rpm -Uvh package1.rpm package2.rpm ...

Главные причины, почему просто копирование материала в Вашу файловую систему является неправильным:

  • источник двоичных файлов не может быть надежным, особенно с точки зрения безопасности. Вы просто не запускаете программ, которые кто-то дает Вам - использование пакета распределения дает Вам по крайней мере некоторое обеспечение о содержании пакета (например, будучи криптографически подписанным);

  • двоичные файлы связаны против общих библиотек (например, libncursesw в Вашем случае) - если Вы не обеспечиваете достаточно совместимую библиотеку, Вы направляетесь в проблемы (которые трудно отладить).

2
12.03.2015, 00:20
1 ответ

pipeto

К сожалению, встроенный фильтр pipeto rlwrap не фильтрует выходные данные желаемым образом. Я считаю, что документация вводит в заблуждение, но если вы запустите rlwrap -z pipeto some-shell , а затем во взаимодействии:

  • , если вы вводите команды без знака вертикальной черты ( | ), они дословно передаются в some-shell , а затем вывод просто печатается;

  • если вы набираете command | filter , затем команда передается в some-shell для интерпретации, и выходные данные передаются через фильтр перед печатью (где filter - это любая команда, которую вы можете запустить из командной строки в вашей оболочке Unix).

Хорошая новость в том, что вы можете получить желаемое поведение, kindof, sortof, запустив rlwrap -z pipeto asterisk , а затем не забудьте добавить | grc каждой команде, которую вы хотите передать звездочке. Но это было бы не очень удобно, правда? Отсюда аутфильтр .

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 'оболочка . Я пробовал использовать:

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

, который красиво окрашивает вывод Гоша.В вашем случае это будет примерно так:

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

Если вам нравится фильтр и вы хотите иметь возможность запускать его без указания пути к нему, вы можете переместить его вместе со встроенными фильтрами (в моей системе это в каталоге / usr / share / rlwrap / filters ).

Обратите внимание, что фильтр в том виде, в каком он написан, вероятно, неэффективен (он порождает новую копию окрашивающего фильтра для каждого взаимодействия с командной оболочкой, потому что это самый короткий способ, который я мог найти, чтобы он очистил свои буферы) и хрупкий, но если оболочка, с которой вы взаимодействуете, сама по себе не творит черной магии, она должна работать.

5
27.01.2020, 21:56

Теги

Похожие вопросы