yankı testi | stty -echo -> stty: standart girdi: Cihaz için uygun olmayan ioctl


9

Aşağıdaki ile kullanıcı girişi alır perl komut dosyası ile oynuyordu:

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

Ben yankı kullanarak bir yanıt boru mümkün olacağını düşündüm ancak stty -echo komutu ile çakışıyor gibi görünüyor ve aşağıdaki hata üretir:

stty: standard input: Inappropriate ioctl for device

Perl betiğini değiştirmeden bash'ta girdiyi geçmek için ne yapılabilir? Soruna ne sebep oluyor?


perl kullanımı yerine yorumlayıcı yerine: örneğin: thegeekstuff.com/2010/10/expect-examples
PersianGulf

Perl örneği sorunu vurgulamıyor olabilir. Hata temel olarak bu diziden kaynaklanır: echo test | stty-eko;
user2219808

Yanıtlar:


5

stty -echogirdi dosyası tanımlayıcısındaki ayarları değiştirir. Stty komutuna bir şey ekliyorsanız, giriş dosyası tanımlayıcısı pipodur ve bir pipetteki stty, ha, uygunsuzdur (hata mesajının söylediği gibi).

Neyi başarmaya çalıştığınız belli değil. Metni satırda testokunmak için perl betiğinize göndermek istiyorsanız my $input = <STDIN>;, stty şeylerinden kurtulun.

Metni kullanıcı girişi olarak (yani yazılır) okumak istiyorsanız ve bunu yaparken metnin yankılanmasını (örneğin bir şifre) önlemek istiyorsanız, stty yapmadan önce standart girişin bir tty (terminal) olup olmadığını test edin:

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

Bununla birlikte, her türlü şey için kabuk vermeyin, perl bunun için değildir (aksi takdirde her şeyi kabukta yazabilirsiniz). Stty ayarlarını perl içinden değiştirebilirsiniz, google arkadaşınızdır.


Bu benim senaryom değildi, bu yüzden değiştirmek olmadan giriş geçmek ve otomatikleştirmek için yollar arıyordu. Beklenti muhtemelen çözüm, ben bir şeyleri boru için başka bir yol olabilir düşündüm.
user2219808

system( qw( stty -echo < /dev/tty) );olası bir çözümdür, ancak komut dosyasının daha sonra yankıyı geri yüklemesi gerekir. Beklentiyi kullanmak daha uygun olabilir.
Henk Langeveld

2

sttystandart girişindeki terminale bağlanır. Perl betiğini, üzerinde çalışmak istediğiniz terminale bağlı standart girişi ile çalıştırmanız gerekir. Perl betiğinin kendisi standart girdinin terminalden başka bir şeye yönlendirildiği bir kapsamdan çağrılırsa /dev/tty, işlemin kontrol terminaline başvurmak için kullanabilirsiniz :

that_perl_script </dev/tty

Komut dosyasına girdi iletmek istiyorsanız ve komut dosyasının terminal ayarlarıyla ne yaptığını umursamıyorsanız, beklemeyi kullanabilirsiniz . Terminal gerektiren bir komuta şifre beslemek için bekleme özelliğini kullanmak yaygındır.

Perl betiği yalnızca sttykomutu çağırarak terminale erişirse, alternatif bir yaklaşım sahte bir sttykomut sağlamak olacaktır .

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.