エコーテスト| stty -echo-> stty:標準入力:デバイスの不適切なioctl


9

私は次のようにユーザー入力を受け取るperlスクリプトで遊んでいました:

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

echoを使用して応答をパイプすることができると思いましたが、stty -echoコマンドと競合し、次のエラーを生成します。

stty: standard input: Inappropriate ioctl for device

perlスクリプトを変更せずに、入力を渡すためにbashで何ができるでしょうか?何が問題の原因ですか?


perlの代わりに期待インタプリタを使用します。例:thegeekstuff.com/2010/10/expect-examples
PersianGulf

perlの例は問題を強調していないかもしれません。エラーは基本的にこのシーケンスから発生します:エコーテスト| stty -echo;
user2219808 2014

回答:


5

stty -echo入力ファイル記述子の設定を変更します。sttyコマンドに何かをパイプしている場合、入力ファイル記述子はパイプであり、パイプ上のsttyは、ええと、不適切です(エラーメッセージのように)。

何を達成しようとしているのかは不明です。テキストtestをperlスクリプトに送信して、そのmy $input = <STDIN>;行で読み取られるようにしたい場合は、単にstty を削除します。

テキストをユーザー入力(つまり、入力)として読み取り、テキストのエコー(パスワードなど)を防止する場合も、sttyを実行する前に標準入力がtty(端末)かどうかをテストします。

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

そうは言っても、あらゆる種類のシェルを実行しないでください。それはperlの目的ではありません(そうでない場合は、全体をシェルで記述することもできます)。Perl内からstty設定を変更できます。Googleがあなたの友達です。


それは私のスクリプトではなかったので、入力を渡し、変更せずに自動化する方法を探していました。期待はおそらく解決策ですが、私はパイプのものに別の方法があったかもしれないと思った。
user2219808

system( qw( stty -echo < /dev/tty) );可能な回避策ですが、スクリプトは後でエコーを復元する必要があります。expectを使用する方が適している場合があります。
Henk Langeveld 2014

2

stty端末の標準入力に接続します。動作させたい端末に接続された標準入力でPerlスクリプトを実行する必要があります。Perlスクリプト自体が、標準入力が端末以外にリダイレクトされるスコープから呼び出された場合/dev/tty、プロセスの制御端末を参照するために使用できます。

that_perl_script </dev/tty

入力をスクリプトに渡すことができて、スクリプトがターミナル設定で何をするかを気にしない場合は、expectを使用できます。端末を必要とするコマンドにパスワードを渡すためにexpectを使用することは一般的です。

Perlスクリプトがsttyコマンドを呼び出すことによってのみ端末にアクセスする場合、別のアプローチはダミーsttyコマンドを提供することです。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.