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?
Jawaban:
stty -echo
mengubah 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
test
ke skrip perl Anda untuk dibaca dimy $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.
sumber
system( qw( stty -echo < /dev/tty) );
adalah solusi yang mungkin, tetapi skrip perlu mengembalikan gema setelahnya. Menggunakan harapan mungkin lebih cocok.stty
terhubung 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/tty
untuk merujuk ke terminal pengontrol proses: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
stty
perintah, pendekatan alternatif adalah memberikanstty
perintah dummy .sumber