Ich habe mit einem Perl-Skript gespielt, das Benutzereingaben wie folgt verarbeitet:
system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;
Ich dachte, ich könnte eine Antwort mit Echo weiterleiten, aber es scheint mit dem Befehl stty -echo in Konflikt zu stehen und erzeugt den folgenden Fehler:
stty: standard input: Inappropriate ioctl for device
Was könnte in Bash getan werden, um die Eingabe zu übergeben, ohne das Perl-Skript zu ändern? Was verursacht das Problem?
Antworten:
stty -echo
Ändert die Einstellungen im Deskriptor der Eingabedatei. Wenn Sie etwas an den Befehl stty weiterleiten, ist der Deskriptor der Eingabedatei die Pipe, und stty auf einer Pipe ist unangemessen (wie in der Fehlermeldung angegeben).Es ist unklar, was Sie erreichen wollen. Wenn Sie den Text
test
an Ihr Perl-Skript senden möchten, um ihn in dermy $input = <STDIN>;
Zeile zu lesen , entfernen Sie einfach das Stty-Zeug.Wenn Sie den Text auch als Benutzereingabe lesen möchten (dh eingegeben haben) und dabei verhindern möchten, dass der Text wiedergegeben wird (z. B. ein Kennwort), testen Sie, ob die Standardeingabe eine tty (Terminal) ist, bevor Sie die stty ausführen:
system( qw( stty -echo ) ) if -t 0;
Das heißt, nicht für alle möglichen Dinge berappen, dafür ist Perl nicht gedacht (sonst können Sie das Ganze genauso gut in Schalen schreiben). Sie können die Stty-Einstellungen in Perl ändern. Google ist Ihr Freund.
quelle
system( qw( stty -echo < /dev/tty) );
ist eine mögliche Problemumgehung, aber das Skript muss das Echo anschließend wiederherstellen. Die Verwendung von Expect kann besser passen.stty
Wird über seinen Standardeingang mit dem Terminal verbunden. Sie müssen das Perl-Skript mit seiner Standardeingabe ausführen, die mit dem Terminal verbunden ist, auf das Sie reagieren möchten. Wenn das Perl-Skript selbst von einem Bereich aus aufgerufen wird, in dem die Standardeingabe an etwas anderes als das Terminal umgeleitet wird, können Sie/dev/tty
auf das steuernde Terminal des Prozesses verweisen:Wenn Sie Eingaben an das Skript übergeben möchten und sich nicht darum kümmern möchten, was das Skript mit den Terminaleinstellungen macht, können Sie erwarten verwenden . Es ist üblich, zu erwarten, dass einem Befehl, für den ein Terminal erforderlich ist, ein Kennwort zugeführt wird.
Wenn das Perl-Skript nur durch Aufrufen des
stty
Befehls auf das Terminal zugreift , besteht ein alternativer Ansatz darin, einen Dummy-stty
Befehl bereitzustellen .quelle