Echotest | stty -echo -> stty: Standardeingabe: Unangemessenes ioctl für Gerät


9

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?


Anstelle von Perl-Verwendung erwarten Sie Interpreter: wie zum Beispiel: thegeekstuff.com/2010/10/expect-examples
PersianGulf

Das Perl-Beispiel hebt das Problem möglicherweise nicht hervor. Der Fehler ergibt sich im Wesentlichen aus dieser Sequenz: Echotest | stty -echo;
user2219808

Antworten:


5

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 testan Ihr Perl-Skript senden möchten, um ihn in der my $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.


Es war nicht mein Skript, also suchte ich nach Möglichkeiten, Eingaben zu übergeben und zu automatisieren, ohne sie zu ändern. Erwarten Sie ist wahrscheinlich die Lösung, ich dachte, es könnte eine andere Möglichkeit gegeben haben, Dinge
einzuspeisen

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.
Henk Langeveld

2

sttyWird ü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/ttyauf das steuernde Terminal des Prozesses verweisen:

that_perl_script </dev/tty

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 sttyBefehls auf das Terminal zugreift , besteht ein alternativer Ansatz darin, einen Dummy- sttyBefehl bereitzustellen .

mkdir dummy-stty
echo '#!/bin/sh' >dummy-stty/stty
chmod a+rx dummy-stty/stty
echo swordfish | PATH=$PWD/dummy-stty:$PATH that_perl_script
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.