私のスクリプトは、入力ストリームのデータが存在するかどうかによって異なる動作をする必要があります。したがって、次のように呼び出すことができます。
$ my-script.sh
または:
$ my-script.sh <<-MARK
Data comes...
...data goes.
MARK
または:
$ some-command | my-script.sh
最後の2つのケースではデータを読み、最初のケースではデータの損失を確認し、それに応じて対処する必要があります。
スクリプト(抜粋)の主な部分は次のとおりです。
#!/bin/bash
local myData;
read -d '' -t 0 myData;
[ -z "${myData}" ] && {
# Notice the lack of the data.
} || {
# Process the data.
}
私はread
入力データを読み、次に-d ''
複数の行(予測)を読み、-t 0
タイムアウトを0に設定することを選択しました。タイムアウトの理由は何ですか? ~によるとhelp read
(入力は変更されずにそのまま残ります。太字は私が書いたものです):
-t timeout
入力行全体を数秒以内に読み取らないと、タイムアウトしてフェイルを返しますTIMEOUT
。この変数の値はTMOUT
デフォルトのタイムアウトです。TIMEOUT
たぶん10進数であるかもしれません。 0 の場合、TIMEOUT
指定されたファイル記述子から入力が可能な場合にのみ読み取りは成功を返します。。タイムアウトを超過すると、終了ステータスは128より大きくなります。
だから私が理解したところによると、2番と3番の場合、データをすぐに読む必要があります。残念ながら、これは本当ではありません。-t
(上記のマニュアルページに従って)10進値を取ることができるので、読み取り行を次のように変更します。
read -d '' -t 0.01 myData;
データがある場合は実際に読み込み、ない場合はスキップします(10msタイムアウト後)。ただし、TIMEOUT
realに設定しても機能します0
。
実際にはなぜできないのですか?この問題をどのように解決しますか?たぶん、「データの存在に応じて異なる動作」という問題に対する別の解決策がありますか?
修正する
@Isaac ありがとうございます。引用されたオンラインバージョンと私のローカルバージョンの間に誤解を招くという違いが見つかりました。 (通常、ロケールがen_USに設定されていないため、翻訳が提供されますが、help read
ここに貼り付けることはできません。新しい環境を設定するよりもオンライン翻訳が高速ですが、それは問題全体の原因です)。
したがって、Bashバージョン4.4.12の場合:
TIMEOUT が 0 の場合、読み取りは直ちに返されます。データを読み取ろうとせずに、指定されたファイル記述子から入力が可能な場合にのみ成功を返します。
これは、「TIMEOUTが0の場合、指定されたファイル記述子から入力が可能な場合にのみ読み取りが成功を返します」という印象を与えます。私にとって、これは実際にデータを読み取ろうとすることを意味します。
だから最後にこれをテストし、うまくいきました。
read -t 0 && read -d '' myData;
意味:読んでいることを確認し、成功したら読んでください。
イサクは基本的な質問に対する正解を提示します。代替ソリューションについては、上記の「読み取り&&読み取り」アプローチを好みます。
ベストアンサー1
read -t 0
いいえいいえすべてのデータを読んでください。
あなたは間違ったマニュアルを読んでいます。man read
PATHに名前が付けられたプログラムのマニュアルを提供しますread
。これはマニュアルではありません組み込み吹くread
。
Bashのマニュアルページを読むには、以下をman bash
使用して検索するか、read [-ers]
単に使用してください。
help read
次の内容が含まれています(バージョン4.4)。
タイムアウトが 0 の場合、データの読み込みを試みずにすぐに読み込みが返されます。
したがって、いいえ。データの読み込みには使用されません-t 0
。
- 第1四半期
実際にはなぜできないのですか?
なぜならこれが文書化された作業方法だからです。
- 第2四半期
この問題をどのように解決しますか?
これはバグと見なされ(おそらくそうであると思われる)、bashソースコードが変更された場合にのみ可能です。
- 第3四半期
たぶん、「データの存在に応じて異なる動作」という問題に対する別の解決策がありますか?
はい、実際に解決策があります。help read
上記で引用した内容の後の次の文は次のとおりです。
指定されたファイル記述子から入力が可能な場合にのみ成功を返します。
これは、データを読み取らなくても、利用可能なデータの実際の読み取りをトリガするために使用できることを意味します。
read -t 0 && read -d '' myData
[ "$myData" ] && echo "got input" || echo "no input was available"
これにより遅延は発生しません。