質問: パイプ先のスクリプトでsttyコマンドを使う方法 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
回答: >なぜこのようなエラーが出るのか。 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