dポイントプレゼントキャンペーン実施中!

echo aaa | ./start.sh
上記のようなことをした際、
./start.shに
stty -echo
等のsttyコマンドがあると、
stty: : そのようなデバイスもアドレスもありません。
というメッセージが出力されます。
(実際には正常に処理されています。)

start.shは文末のようなものです。

これを実行すると
% echo aaa | ./start.sh
stty: : そのようなデバイスもアドレスもありません。
please input password:
stty: : そのようなデバイスもアドレスもありません。
aaa
%
となり、「aaa」はちゃんと渡せています。

■質問1
なぜこのようなエラーが出るのか。

■質問2
なぜ上記のようなエラーが出ているのに、
値が渡せているのか。

参考になるような情報でもかまいませんのでよろしくお願いします。


start.sh
#!/bin/sh

stty -echo
echo "please input password:"
read PASSWORD
stty echo

echo $PASSWORD

A 回答 (1件)

>なぜこのようなエラーが出るのか。


stty は標準入力デバイスの設定を表示・変更するコマンドです。デバイスが端末であることを前提としています。パイプにすると標準入力が端末で無くなるのでコマンドが想定していないためエラーになります。

>なぜ上記のようなエラーが出ているのに、値が渡せているのか。
sttyコマンドだけがエラーなので、それ以外の行は正常に実行されます。
echo "please input password:"
read PASSWORD
echo $PASSWORD
は、正常に実行されるため、入力データが表示されることになります。

stty コマンドをシェルスクリプト中で使うときは、test コマンドで、標準入力が端末かどうか調べて、端末のときだけ実行されるようにします。
test -t 0 && stty -echo
もしくは、
if test -t 0
then stty -echo
fi
    • good
    • 0
この回答へのお礼

ご丁寧な解説をいただいたうえ、
解決策まで教えていただきありがとうございます。

お礼日時:2005/07/21 15:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!