Je jouais avec un script Perl qui accepte les entrées utilisateur avec les éléments suivants:
system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;
J'ai pensé que je serais capable de diriger une réponse en utilisant echo, mais cela semble entrer en conflit avec la commande stty -echo et produit l'erreur suivante:
stty: standard input: Inappropriate ioctl for device
Sans changer le script perl, que pourrait-on faire en bash pour passer l'entrée? Qu'est-ce qui cause le problème?
Réponses:
stty -echo
modifie les paramètres du descripteur de fichier d'entrée. Si vous redirigez quelque chose vers la commande stty, alors le descripteur du fichier d'entrée est le canal, et stty sur un canal est, eh, inapproprié (comme le dit le message d'erreur).On ne sait pas exactement ce que vous essayez de réaliser. Si vous voulez envoyer le texte
test
à votre script perl pour qu'il soit lu dans lamy $input = <STDIN>;
ligne, alors débarrassez-vous simplement des choses stty.Si vous souhaitez également lire le texte en tant qu'entrée utilisateur (c'est-à-dire tapé) et éviter de faire écho au texte (par exemple un mot de passe), testez si l'entrée standard est un tty (terminal) avant de faire le stty:
system( qw( stty -echo ) ) if -t 0;
Cela dit, ne pas débourser pour toutes sortes de choses, ce n'est pas à ça que sert perl (sinon vous pourriez aussi bien écrire le tout en shell). Vous pouvez modifier les paramètres stty depuis Perl, Google est votre ami.
la source
system( qw( stty -echo < /dev/tty) );
est une solution de contournement possible, mais le script doit ensuite restaurer l'écho. Utiliser expect peut être un meilleur choix.stty
se connecte au terminal sur son entrée standard. Vous devez exécuter le script Perl avec son entrée standard connectée au terminal sur lequel vous souhaitez agir. Si le script Perl est lui-même invoqué depuis une étendue où l'entrée standard est redirigée vers autre chose que le terminal, vous pouvez utiliser/dev/tty
pour faire référence au terminal de contrôle du processus:Si vous voulez pouvoir transmettre des entrées au script et que vous ne vous souciez pas de ce que le script fait avec les paramètres du terminal, vous pouvez utiliser expect . L'utilisation de s'attendre à fournir un mot de passe à une commande qui nécessite un terminal est courante.
Si le script Perl accède uniquement au terminal en appelant la
stty
commande, une approche alternative serait de fournir unestty
commande factice .la source