私は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)
調べてみましょう。これ最も近い答えです。しかし、それは正確ではありません。私のスクリプトはうまく動作します。これが私が扱うべき問題なのか、それともBashを使ってこれを行う標準的な方法なのか疑問に思います。ioctl
この関数がすべての行で呼び出されることは驚くべきではありませんか?-u
Bashの主張が関連性がある可能性があると思いました。
-u fd Read input from file descriptor fd.
いくつかの実験をしましたが、成功しませんでした。したがって、このオプションの使用方法は別の質問かもしれません。
私はBashバージョン4.3.48(1)でUbuntu 16.04を使用しています。
答え1
削除することも、削除する理由もありません。これは、入力が端末から来ていることを確認するbashから来ます(呼び出し)。isatty
)。実際、さまざまなオプションを渡す場合にのみこの情報を使用しません。詳細がわからない場合は、ソースコード(read_builtin
の関数builtins/read.def
)を読んでください。
TCGETS
ioctlが返されるという事実ENOTTY
は、アプリケーションが入力が端末ではないことを知る方法です。これは予想されます。関数がエラー状態を返しても問題が発生したという意味ではありません。