tes gema | stty -echo -> stty: input standar: ioctl yang tidak sesuai untuk perangkat

9

Saya bermain dengan skrip perl yang mengambil input pengguna dengan yang berikut:

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

Saya pikir saya akan dapat memberikan respons menggunakan echo namun tampaknya bertentangan dengan perintah stty -echo dan menghasilkan kesalahan berikut:

stty: standard input: Inappropriate ioctl for device

Tanpa mengubah skrip perl apa yang bisa dilakukan di bash untuk lulus dalam input? Apa yang menyebabkan masalah?

pengguna2219808
sumber
alih-alih perl gunakan juru bahasa: seperti: thegeekstuff.com/2010/10/expect-examples
PersianGulf
Contoh perl mungkin tidak menyoroti masalah ini. Kesalahan pada dasarnya muncul dari urutan ini: echo test | stty -echo;
user2219808

Jawaban:

5

stty -echomengubah pengaturan pada deskriptor file input. Jika Anda mem-pipkan sesuatu ke perintah stty, maka deskriptor file input adalah pipa, dan stty pada pipa, eh, tidak pantas (seperti pesan kesalahan mengatakan).

Tidak jelas apa yang ingin Anda capai. Jika Anda ingin mengirim teks testke skrip perl Anda untuk dibaca di my $input = <STDIN>;baris, maka cukup singkirkan barang-barang stty.

Jika Anda juga ingin membaca teks sebagai input pengguna (mis. Diketikkan) dan sambil melakukan itu mencegah teks digemakan (misalnya kata sandi) kemudian menguji apakah input standar adalah tty (terminal) sebelum melakukan stty:

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

Yang mengatakan, jangan keluar untuk segala macam hal, itu bukan untuk perl (jika tidak Anda mungkin juga menulis semuanya dalam shell). Anda dapat mengubah pengaturan stty dari dalam perl, google adalah teman Anda.

Wurtel
sumber
Itu bukan skrip saya, jadi saya mencari cara untuk lulus input dan mengotomatiskannya tanpa mengubahnya. Harapkan mungkin solusinya, saya pikir mungkin ada cara lain untuk menyalurkan berbagai hal.
user2219808
system( qw( stty -echo < /dev/tty) );adalah solusi yang mungkin, tetapi skrip perlu mengembalikan gema setelahnya. Menggunakan harapan mungkin lebih cocok.
Henk Langeveld
2

sttyterhubung ke terminal pada input standarnya. Anda perlu menjalankan skrip Perl dengan input standar yang terhubung ke terminal yang ingin Anda tindak lanjuti. Jika skrip Perl itu sendiri dipanggil dari ruang lingkup di mana input standar dialihkan ke sesuatu selain terminal, Anda dapat menggunakan /dev/ttyuntuk merujuk ke terminal pengontrol proses:

that_perl_script </dev/tty

Jika Anda ingin dapat memberikan input ke skrip, dan Anda tidak peduli tentang apa yang skrip lakukan dengan pengaturan terminal, Anda dapat menggunakan harapkan . Menggunakan harapkan untuk memberi makan kata sandi ke perintah yang membutuhkan terminal adalah hal biasa.

Jika skrip Perl hanya mengakses terminal dengan memanggil sttyperintah, pendekatan alternatif adalah memberikan sttyperintah dummy .

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 'SANGAT berhenti menjadi jahat'
sumber