foo.sh < test.txt
非対話型のように、stdinからの入力を受け取る場合と受け取らない場合があるPOSIXシェルスクリプトを作成しています。
stdinに何かがあるかどうかを確認して、停止しないようにするにはどうすればよいwhile read -r line...
ですか?
質問が正しければ、次のことを試してみてください。
#!/bin/sh
if [ -t 0 ]; then
echo running interactivelly
else
while read -r line ; do
echo $line
done
fi
質問に文字通り答えるには(ただし、実際に必要なものではありません):read -t 0
タイムアウト、ゼロ秒。
-t 5
が、スラッシングシステムではそれでも問題があります。read -t
SUSv3では標準化されていません。BSD sh、bash、zshにあります。kshやダッシュではありません。したがって、#!/ bin / shを使用して、これを期待することはできません。
基本的な問題は、現在stdinに何もないとしても、すぐになくなるという意味ではないということです。プログラムを呼び出すと、通常、stdinは端末などに接続されたままになるため、何が必要かを判断する方法はありません。
だから、あなたの質問に文字通り答えるために、あなたはそれをすることができます、しかし実際にはあなたの選択肢は次のとおりです:
[ -t 0 ]
「cat」コマンドと同様の動作を簡単に実装できます。これは、提供されたファイルのリストから読み取られるか、提供されていない場合はstdinから読み取られます。
このアイデアを使用しないかもしれませんが、このLinuxJournalの記事はあなたにとって興味深いものになると思いますhttp://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or-pipe
:-)
スクリプトをインタラクティブに実行したくない場合は、を使用するのではなく、入力ファイルをパラメーターとして受け取るようにしますstdin
。一部のプログラムは、フラグまたは特別なファイル名を使用して、ファイルからではなく標準入力から入力を受け取る必要があることを示します。その場合、必要に応じてコマンドラインジョッキーを処理できます。
スクリプトに標準の入力を使用させたい場合は、スクリプトをインタラクティブに(または少なくとも他のPOSIXツールのように動作させて)みませんか?