このコードでstrace
を使用しています:
#!/usr/bin/env bash
exec 0<test.log
while IFS= read -r line; do
printf "%s\n" "$line"
done
(ストレート<test.log
リダイレクトでも同じ結果が得られます。)
読み取り行ごとにこのエラーが発生します。
ioctl(0, TCGETS, 0x7fff1e645d50) = -1 ENOTTY (Inappropriate ioctl for device)
私はいくつかの調査を行いました this が最も近い答えです。しかし、それはスポットオンになるにはほど遠いです。私のスクリプトは正常に動作します。これが私が対処する必要があるものなのか、それともBashの標準的な方法なのか疑問に思っています。 ioctl
関数が各行で呼び出されるのは印象的ではありませんか? -u
Bashのパラメーターは関連している可能性があります:
-u fd Read input from file descriptor fd.
私は役に立たないようにいくつかの実験をしました。したがって、このオプションがどのように使用されることになっているのかは、別の問題かもしれません。
私はBash 4.3.48(1)リリースのUbuntu 16.04を使用しています。
あなたはそれを取り除くことができず、とにかくそれを削除する理由はありません。これは、入力が端末からのものであるかどうかをbashでチェックすることから来ます(それは isatty
を呼び出します)。実際にこの情報を使用するのは、さまざまなオプションが渡された場合のみです。詳細に興味がある場合は、ソースコード(read_builtin
関数builtins/read.def
)。
TCGETS
ioctlがENOTTY
を返すのは、アプリケーションが入力が端末ではないことを通知する方法です。予想通りです。関数がエラーステータスを返すからといって、何かが間違っているというわけではありません。