Способ разобрать терминал ввода / вывода? (.bashrc?) - PullRequest
1 голос
/ 08 августа 2009

Есть ли способ проанализировать ввод и вывод команд bash в интерактивном терминале, прежде чем они достигнут экрана? Я думал, может быть, что-то в .bashrc, но я новичок в использовании Bash.

Например:

  • Я набираю "ls / home / foo / bar /"
  • Это передается через скрипт, который заменяет все экземпляры 'bar' на 'eggs'
  • "ls / home / foo / eggs /" выполняется
  • Вывод отправляется обратно в скрипт замены
  • Вывод скрипта отправляется на экран

1 Ответ

2 голосов
/ 08 августа 2009

Да. Вот что я написал для собственного использования, чтобы обернуть старые программы на Fortran, которые запрашивают пути к файлам из командной строки. Это позволяет вернуться обратно в оболочку, например, работает "лс". Это работает только в одном направлении, то есть перехватывает ввод пользователя, а затем передает его программе, но дает вам большую часть того, что вы хотите. Вы можете адаптировать его к вашим потребностям.

#!/usr/bin/perl

# shwrap.pl - Wrap any process for convenient escape to the shell.
# ire_and_curses, September 2006

use strict;
use warnings;


# Check args
my $executable = shift || die "Usage: shwrap.pl executable";

my @escape_chars = ('#');                    # Escape to shell with these chars
my $exit = 'exit';                           # Exit string for quick termination

open my $exe_fh, "|$executable @ARGV" or die "Cannot pipe to program $executable: $!";

# Set magic buffer autoflush on...
select((select($exe_fh), $| = 1)[0]);

# Accept input until the child process terminates or is terminated...
while ( 1 ) {
   chomp(my $input = <STDIN>);

   # End if we receive the special exit string...   
   if ( $input =~ m/$exit/ ) {
      close $exe_fh;
      print "$0: Terminated child process...\n";
      exit;            
   }

   foreach my $char ( @escape_chars ) {   
      # Escape to the shell if the input starts with an escape character...
      if ( my ($command) = $input =~ m/^$char(.*)/ ) {
         system $command;
      }
      # Otherwise pass the input on to the executable...
      else {
         print $exe_fh "$input\n";
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...