私はこの質問を何度も受けましたが、私には役に立たないようです。
[[ ! -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 FD
FD
端末で開かれたファイル記述子
そして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 _
パイプから読み取っていてビルダーがない場合、この操作はまだ(上から)中断されます。作成者がいる場合は、作成者が読み取る内容を作成していない場合でも、説明されているように機能します。