2009-08-08 8 views
0

Existe-t-il un moyen d'analyser l'entrée et la sortie des commandes bash dans un terminal interactif avant qu'elles n'atteignent l'écran? Je pensais peut-être quelque chose en .bashrc, mais je suis nouveau à l'utilisation de bash.Une façon d'analyser la sortie/l'entrée du terminal? (.bashrc?)

Par exemple:

  • type I "ls/home/foo/bar /"
  • qui est passé à travers un script qui remplace toutes les instances de 'bar' avec 'oeufs'
  • " ls/home/foo/oeufs/» est exécuté
  • la sortie est envoyé vers le remplacement de script
  • la sortie du script est envoyé à l'écran

Répondre

2

Oui. Voici quelque chose que j'ai écrit pour mon propre usage, pour envelopper les anciens programmes Fortran en ligne de commande qui demandent des chemins de fichiers. Cela permet de s'échapper vers la coquille, par ex. courir 'ls'. Cela ne fonctionne que dans un sens, c'est-à-dire qu'il intercepte les entrées utilisateur, puis les transmet à un programme, mais il obtient la plupart de ce que vous voulez. Vous pouvez l'adapter à vos besoins.

#!/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

Existe-t-il un moyen de faire fonctionner des choses telles que les touches fléchées et l'historique avec votre script? – Annan

+0

Pas que je sache. Ce sont des builtins shell, et supposons que le shell fonctionne interactivement (ce qui n'est pas le cas dans ce cas). Si vous voulez plus de fonctionnalités que cela, vous cherchez vraiment à écrire votre propre shell - ce qui n'est pas aussi difficile que ça en a l'air. Voir par exemple http://linuxgazette.net/111/ramankutty.html –

Questions connexes