シェルスクリプトのstdinでファイル入力を使用すると機能しません。

シェルスクリプトのstdinでファイル入力を使用すると機能しません。

次のスクリプトコードがあります。

テストファイル

echo "BEGIN"
while read CMD <&1; do
    [ -z "$CMD" ] && continue
    case "$CMD" in
    start)
            echo "get_start"
            ;;
    stop)
            echo "get_stop"
            ;;
    *)
            echo "get_uknown_command"
            ;;
    esac
    echo "END";
done

私がそれを実行したとき:

$./test.sh <input.txt

私のスクリプトはロックされています。

入力.txt

start
stop
sthh

私のスクリプトはなぜロックされていますか?この問題をどのように解決できますか?

注:データを手動で入力すると、スクリプトはロックされません。

ベストアンサー1

とにかく、2行目は不正確で過度に複雑です。これファイル記述子stdinstdoutstderrそれぞれ01、 なので、必要な内容を2読むstdin

while read CMD <&0; do 

しかしstdinの基本入力はなのでread

while read CMD; do

これが実際に最も簡単な方法です。この方法でコマンドを手動で入力するか、コマンドラインからリダイレクトを使用してファイルを読み取ることができます。

おすすめ記事