test echa | stty -echo -> stty: standardowe wejście: niewłaściwy ioctl dla urządzenia

9

Bawiłem się skryptem perla, który pobiera dane wejściowe od użytkownika w następujący sposób:

system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;

Myślałem, że będę w stanie wysłać potok w odpowiedzi za pomocą echa, jednak wydaje się, że koliduje on z poleceniem stty -echo i powoduje następujący błąd:

stty: standard input: Inappropriate ioctl for device

Bez zmiany skryptu perla, co można zrobić w bash, aby przekazać dane wejściowe? Co powoduje problem?

użytkownik2219808
źródło
zamiast perla użyj interpretera: na przykład: thegeekstuff.com/2010/10/expect-examples
PersianGulf
Przykład perla może nie podkreślać problemu. Błąd zasadniczo wynika z tej sekwencji: test echa | stty -echo;
user2219808

Odpowiedzi:

5

stty -echozmienia ustawienia deskryptora pliku wejściowego. Jeśli przesyłasz coś do polecenia stty, to deskryptorem pliku wejściowego jest potok, a stty na potoku jest, eh, nieodpowiednie (jak mówi komunikat o błędzie).

Nie jest jasne, co próbujesz osiągnąć. Jeśli chcesz wysłać tekst testdo skryptu Perla, aby został odczytany w my $input = <STDIN>;linii, po prostu pozbądź się sztywnych rzeczy.

Jeśli chcesz również czytać tekst jako dane wprowadzane przez użytkownika (tj. Wpisywać), a jednocześnie zapobiegać odbijaniu tekstu (np. Hasło), sprawdź, czy standardowym wejściem jest tty (terminal) przed wykonaniem stty:

system( qw( stty -echo ) ) if -t 0;

To powiedziawszy, nie wypowiadaj się na różne rzeczy, nie po to jest perl (w przeciwnym razie możesz napisać całość w powłoce). Możesz zmienić ustawienia STTY z poziomu Perla, Google jest Twoim przyjacielem.

wurtel
źródło
To nie był mój skrypt, więc szukałem sposobów na przekazanie danych wejściowych i zautomatyzowanie ich bez zmiany. Spodziewaj się, że to prawdopodobnie rozwiązanie, myślałem, że może istnieć inny sposób na wprowadzanie
potoków
system( qw( stty -echo < /dev/tty) );jest możliwym obejściem, ale skrypt musi później przywrócić echo. Używanie funkcji oczekiwania może być lepszym rozwiązaniem.
Henk Langeveld
2

sttyłączy się z terminalem na jego standardowym wejściu. Musisz uruchomić skrypt Perla ze standardowym wejściem podłączonym do terminala, na którym chcesz działać. Jeśli skrypt Perla jest wywoływany z zakresu, w którym standardowe dane wejściowe są przekierowywane do czegoś innego niż terminal, możesz użyć, /dev/ttyaby odwołać się do terminala sterującego procesem:

that_perl_script </dev/tty

Jeśli chcesz mieć możliwość przekazywania danych wejściowych do skryptu i nie obchodzi Cię, co skrypt robi z ustawieniami terminala, możesz użyć funkcji expect . Używanie metody oczekiwania na podanie hasła do polecenia wymagającego terminala jest powszechne.

Jeśli skrypt Perla uzyskuje dostęp do terminala tylko poprzez wywołanie sttypolecenia, alternatywnym podejściem byłoby zapewnienie fałszywego sttypolecenia.

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
Gilles „SO- przestań być zły”
źródło