エコテスト| stty -echo -> stty:stdin:デバイスのioctlが不適切です。

エコテスト| stty -echo -> stty:stdin:デバイスのioctlが不適切です。

次のようにユーザー入力を許可する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で何をすることができますか?問題の原因は何ですか?

答え1

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

何を達成したいのか明確ではありません。テキストをtestPerlスクリプトに送信してその行から読み取るには、my $input = <STDIN>;sttyコンテンツを削除します。

また、テキストをユーザー入力(入力など)として読み込み、テキストがエコー(パスワードなど)されないようにするには、sttyを実行する前にstdinがtty(ターミナル)であることをテストしてください。

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

つまり、あらゆる種類の仕事に費用を払わないでください。それはPerlの目的ではありません(それ以外の場合はすべてをシェルに書くほうが良いでしょう)。 Perlでstty設定を変更できます。 Googleはあなたの友達です。

答え2

stty端末の標準入力に接続します。 Perlスクリプトを実行し、その標準入力を操作したい端末に接続する必要があります。 Perlスクリプト自体がターミナルではなくスコープにリダイレクトされた標準入力から呼び出される場合は、次のようにプロセスの/dev/tty制御ターミナルを参照できます。

that_perl_script </dev/tty

スクリプトに入力を渡したい場合、スクリプトが端末の設定にどのような影響を与えるか気にしない場合は、次のようにします。予想される。期待を活用する端末が必要なコマンドにパスワードを提供一般的な。

Perlスクリプトがコマンドを呼び出してのみ端末にアクセスする場合、もう1つの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

関連情報