4

stdin を介して受信するものがあるかどうかに応じて、ksh スクリプトの動作が異なるようにします。

    (1) cat file.txt | ./script.ksh  (then do "cat <&0 >./tmp.dat" and process tmp.dat)
vs. (2) ./script.ksh (then process $1 which must be a readable regular file)

私のスクリプトは他のスクリプトから呼び出されるため、stdin が端末 [ -t 0 ] であるかどうかを確認することは役に立ちません。

「cat <&0 >./tmp.dat」を実行して tmp.dat のサイズをチェックすると、stdin が「空」の場合、stdin からの EOF を待ってハングアップします (2 番目のケース)。

標準入力が「空」かどうかを確認する方法は?!

4

3 に答える 3

4

編集:HP-UXで実行しています

[ -t 0 ]HP-UX でテストしたところ、うまく機能しているようです。次のセットアップを使用しました。

/tmp/x.ksh:

#!/bin/ksh
/tmp/y.ksh

/tmp/y.ksh:

#!/bin/ksh
test -t 0 && echo "terminal!"

実行中/tmp/x.kshの印刷物:terminal!

プラットフォームで上記を確認し、状況をより正確に反映した別のテスト セットアップを提供していただけますか? あなたのスクリプトは最終的にによって生成されcronますか?


編集2

必死で、Perl が利用可能な場合は、次のように定義します。

stdin_ready() {
  TIMEOUT=$1; shift
  perl -e '
    my $rin = "";
    vec($rin,fileno(STDIN),1) = 1;
    select($rout=$rin, undef, undef, '$TIMEOUT') < 1 && exit 1;
  '
}

stdin_ready 1 || 'stdin not ready in 1 second, assuming terminal'

編集3

sort入力が などからのものである場合は、タイムアウトを大きくする必要があることに注意してくださいssh(これらのプログラムはすべて、データを生成する数秒または数分前に、スクリプトを使用してパイプを生成および確立できます)。そもそも入力に何もない場合(ターミナルなど)、スクリプトにペナルティを課します。

タイムアウトが大きくなる可能性があることが問題であり、スクリプトの呼び出し方法に影響を与えることができる場合は、カスタム オプションまたは標準GNUまたはtar方法 (例: script [options [--]] FILE ..., ここで、FILE はファイル名、-標準入力を表す a、またはそれらの組み合わせにすることができ、スクリプトは標準入力からのみ読み取ります-。パラメータ)

于 2009-03-11T19:09:13.067 に答える
2

この戦略は bash で機能し、ksh でも機能する可能性があります。「tty」をポーリングします。

#!/bin/bash
set -a

if [ "$( tty )" == 'not a tty' ]
then
    STDIN_DATA_PRESENT=1
else
    STDIN_DATA_PRESENT=0
fi

if [ ${STDIN_DATA_PRESENT} -eq 1 ]
then
    echo "Input was found."
else
    echo "Input was not found."
fi
于 2009-04-03T15:42:35.707 に答える
0

これをより伝統的な方法で解決し、コマンドライン引数を使用して、データが標準入力から来ることを示してみませんか?

たとえば、次の違いを考えてみましょう。

echo foo | cat -

echo foo > /tmp/test.txt

cat /tmp/test.txt

于 2009-03-26T19:27:10.873 に答える