Bash - 標準入力に何も含まれていることを確認する

Bash - 標準入力に何も含まれていることを確認する

私はこの質問を何度も受けましたが、私には役に立たないようです。

[[ ! -t 0 ]]=標準入力にはどのような内容が含まれていますか?

このコマンドは次のとおりです。

echo 'Hello world' | [[ ! -t 0 ]]
echo $?

正しい出力を提供します。0つまり、標準入力には何も含まれます。
このコマンドは次のとおりです。

[[ ! -t 0 ]]
echo $?

正しい出力を提供します。1つまり、標準入力は空です。
代わりに、次のコマンドを使用してください。

: | [[ ! -t 0 ]]
echo $?

予期しない出力を提供します: 0、標準入力は空です: 1

なぜこれが起こるのですか?この問題をどのように解決できますか?

答え1

[[ ! -t 0 ]]=標準入力にはどのような内容が含まれていますか?

あなたの前提が間違っています。このテストを実行しますか?標準入力代わりにターミナル/ttyに接続するかどうか標準入力何でも含まれます。否定のため、次の条件がtrueの場合、コマンドは0(true)を返します。標準入力端末に接続されていません。

バラよりman test

-t FDFD端末で開かれたファイル記述子

そしてman bash

-t fdファイル記述子がfd開いていて端末を参照している場合は真です。

これを念頭に置いて例を再評価すると、予想される終了ステータスを返すことがわかります。

保留中のアイテムがあるかどうかを確認する正しい方法標準入力を使用しますselect(2)が、これはシェルで直接使用することはできません(例:)bash。私が提案できる最も近い方法は、read即時タイムアウトを使用することです。

sleep 2
if read -t 0 _
then
    echo "Ready to receive data"
    IFS= read -r data
    echo "Received: $data"
fi

実行してから、初期化中にsleep(a)プリロードを試みます。標準入力一部のテキストでは、(b)は何もしません。

read -t 0 _パイプから読み取っていてビルダーがない場合、この操作はまだ(上から)中断されます。作成者がいる場合は、作成者が読み取る内容を作成していない場合でも、説明されているように機能します。

関連情報