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?
Odpowiedzi:
stty -echo
zmienia 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
test
do skryptu Perla, aby został odczytany wmy $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.
źródło
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.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/tty
aby odwołać się do terminala sterującego procesem: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
stty
polecenia, alternatywnym podejściem byłoby zapewnienie fałszywegostty
polecenia.źródło