42

foo.sh < test.txt非対話型のように、stdinからの入力を受け取る場合と受け取らない場合があるPOSIXシェルスクリプトを作成しています。

stdinに何かがあるかどうかを確認して、停止しないようにするにはどうすればよいwhile read -r line...ですか?

4

4 に答える 4

69

質問が正しければ、次のことを試してみてください。

#!/bin/sh
if [ -t 0 ]; then
    echo running interactivelly
else
    while read -r line ; do
        echo $line
    done
fi
于 2010-03-16T18:02:29.830 に答える
8

質問に文字通り答えるには(ただし、実際に必要なものではありません):read -t 0

タイムアウト、ゼロ秒。

  1. これは、左側がデータを提供する準備ができているかどうかに応じて、競合状態です。指定することはできます-t 5が、スラッシングシステムではそれでも問題があります。
  2. read -tSUSv3では標準化されていません。BSD sh、bash、zshにあります。kshやダッシュではありません。

したがって、#!/ bin / shを使用して、これを期待することはできません。

基本的な問題は、現在stdinに何もないとしても、すぐになくなるという意味ではないということです。プログラムを呼び出すと、通常、stdinは端末などに接続されたままになるため、何が必要かを判断する方法はありません。

だから、あなたの質問に文字通り答えるために、あなたはそれをすることができます、しかし実際にはあなたの選択肢は次のとおりです:

  1. stdinがttyであるかどうかをテストします。[ -t 0 ]
  2. argvを使用して動作を制御する
于 2010-03-16T18:52:32.507 に答える
7

「cat」コマンドと同様の動作を簡単に実装できます。これは、提供されたファイルのリストから読み取られるか、提供されていない場合はstdinから読み取られます。

このアイデアを使用しないかもしれませんが、このLinuxJournalの記事はあなたにとって興味深いものになると思いますhttp://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or-pipe

:-)

于 2010-03-16T18:06:24.307 に答える
1

スクリプトをインタラクティブに実行したくない場合は、を使用するのではなく、入力ファイルをパラメーターとして受け取るようにしますstdin。一部のプログラムは、フラグまたは特別なファイル名を使用して、ファイルからではなく標準入力から入力を受け取る必要があることを示します。その場合、必要に応じてコマンドラインジョッキーを処理できます。

スクリプトに標準の入力を使用させたい場合は、スクリプトをインタラクティブに(または少なくとも他のPOSIXツールのように動作させて)みませんか?

于 2010-03-16T17:56:20.077 に答える