2009-08-08 6 views
0

Gibt es eine Möglichkeit, Eingabe und Ausgabe von Bash-Befehlen in einem interaktiven Terminal zu analysieren, bevor sie den Bildschirm erreichen? Ich dachte vielleicht etwas in .bashrc, aber ich bin neu in der Verwendung von bash.Eine Möglichkeit, Terminal-Ausgang/Eingang zu analysieren? (.bashrc?)

Zum Beispiel:

  • I-Typ "ls/home/foo/bar /"
  • , das durch ein Skript übergeben wird, die
  • "alle Instanzen von 'bar' mit 'Eier' ersetzt ls/home/foo/Eier /“
  • ausgeführt wird
  • die Ausgabe an das Skript ersetzen gesendet wird zurück
  • die Ausgabe des Skripts an den Bildschirm gesendet wird

Antwort

2

Ja. Hier ist etwas, das ich für meinen eigenen Gebrauch geschrieben habe, um alte Befehlszeilen-Fortran-Programme zu verpacken, die nach Dateipfaden fragen. Es ermöglicht das Entweichen zurück zur Shell für z.B. läuft 'ls'. Dies funktioniert nur in einer Richtung, d. H. Es fängt Benutzereingaben ab und gibt sie an ein Programm weiter, aber Sie erhalten das meiste von dem, was Sie wollen. Sie können es an Ihre Bedürfnisse anpassen.

#!/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"; 
     } 
    } 
} 
+0

Gibt es einen Weg, um Dinge wie die Pfeiltasten und die Geschichte zu bekommen mit Ihrem Skript zu arbeiten? – Annan

+0

Nicht, dass ich davon weiß. Dies sind Shell-Builtins und gehen davon aus, dass die Shell interaktiv läuft (was in diesem Fall nicht der Fall ist). Wenn Sie mehr Funktionalität als das wollen, dann suchen Sie wirklich Ihre eigene Shell zu schreiben - was nicht so schwer ist wie es klingt. Siehe z.B. http://linuxgazette.net/111/ramankutty.html –

Verwandte Themen