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";
}
}
}
Existe-t-il un moyen de faire fonctionner des choses telles que les touches fléchées et l'historique avec votre script? – Annan
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 –