パイプからユーザー入力を読み取るには?

パイプからユーザー入力を読み取るには?

次のファイルがあるとしますconfirmation.sh

#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
    n|N) echo "smth"
        ;;
    y|Y) echo "smth"
        ;;
esac

次のようにスクリプトを実行したいと思います。

cat confirmation.sh | sh

わかりましたAre you sure [Y/n]?。スクリプトが中断されました。問題は何ですか?

ベストアンサー1

他の人が言ったように、これはパイプから読み取るようにリダイレクトされたため、通常どおり端末に接続されていないためstdinです。shこの問題を解決するためにできることの1つは、/dev/tty強制スクリプトを使用して端末から読むことです。たとえば、

#!/bin/sh

read -p "Are you sure [Y/n]?" line </dev/tty
case "$line" in
  y|Y) echo "confirmed"
    ;;
  *) echo "not confirmed"
    ;;
esac

一般に、人々が入力スクリプトを書くのを特に避けたい場合にのみこれを行います。たとえば、次のようになります。

echo Y | sh confirmation.sh

ユーザーがメッセージが表示されたときに自動的に入力したい場合でも、Y端末から読みます。これは、これを行うためにパスワードが必要なプログラムで一般的です。

おすすめ記事