test di eco | stty -echo -> stty: input standard: ioctl inappropriato per il dispositivo


9

Stavo giocando con uno script perl che accetta l'input dell'utente con quanto segue:

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

Pensavo che sarei stato in grado di reindirizzare una risposta usando echo, tuttavia sembra essere in conflitto con il comando stty -echo e produce il seguente errore:

stty: standard input: Inappropriate ioctl for device

Senza cambiare lo script perl cosa si potrebbe fare in bash per passare l'input? Quali sono le cause del problema?


invece di perl usa un interprete: come ad esempio: thegeekstuff.com/2010/10/expect-examples
PersianGulf,

L'esempio perl potrebbe non evidenziare il problema. L'errore deriva essenzialmente da questa sequenza: test di eco | stty -echo;
user2219808,

Risposte:


5

stty -echomodifica le impostazioni sul descrittore del file di input. Se stai eseguendo il piping di qualcosa al comando stty, il descrittore del file di input è la pipe e stty su una pipe è, eh, inappropriato (come dice il messaggio di errore).

Non è chiaro cosa stai cercando di ottenere. Se vuoi inviare il testo testal tuo script perl per essere letto nella my $input = <STDIN>;riga, allora semplicemente sbarazzati delle cose stty.

Se vuoi anche leggere il testo come input dell'utente (cioè digitato) e mentre lo fai, evita che il testo venga ripetuto (ad es. Una password) quindi verifica se l'input standard è un tty (terminale) prima di eseguire lo stty:

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

Detto questo, non sborsare per ogni sorta di cose, non è per questo che Perl (altrimenti potresti anche scrivere tutto in shell). Puoi modificare le impostazioni stty all'interno di perl, google è tuo amico.


Non era il mio copione, quindi cercavo modi per passare l'input e automatizzarlo senza modificarlo. Aspettarsi è probabilmente la soluzione, ho pensato che avrebbe potuto esserci un altro modo per
convogliare le

system( qw( stty -echo < /dev/tty) );è una possibile soluzione alternativa, ma lo script deve ripristinare l'eco in seguito. L'uso di prevede potrebbe essere una soluzione migliore.
Henk Langeveld,

2

sttysi collega al terminale sul suo ingresso standard. È necessario eseguire lo script Perl con il suo input standard collegato al terminale su cui si desidera agire. Se lo script Perl viene richiamato da un ambito in cui l'input standard viene reindirizzato a qualcosa di diverso dal terminale, è possibile utilizzare /dev/ttyper fare riferimento al terminale di controllo del processo:

that_perl_script </dev/tty

Se vuoi essere in grado di passare l'input allo script e non ti interessa cosa fa lo script con le impostazioni del terminale, puoi usare aspettarti . L'uso di prevede di inviare una password a un comando che richiede un terminale è comune.

Se lo script Perl accede al terminale solo chiamando il sttycomando, un approccio alternativo sarebbe quello di fornire un sttycomando fittizio .

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.