私のBashスクリプトのstrace出力から「デバイスに適していないioctl」を削除する必要がありますか?

私のBashスクリプトのstrace出力から「デバイスに適していないioctl」を削除する必要がありますか?

私は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この関数がすべての行で呼び出されることは驚くべきではありませんか?-uBashの主張が関連性がある可能性があると思いました。

-u fd  Read input from file descriptor fd.

いくつかの実験をしましたが、成功しませんでした。したがって、このオプションの使用方法は別の質問かもしれません。

私はBashバージョン4.3.48(1)でUbuntu 16.04を使用しています。

答え1

削除することも、削除する理由もありません。これは、入力が端末から来ていることを確認するbashから来ます(呼び出し)。isatty)。実際、さまざまなオプションを渡す場合にのみこの情報を使用しません。詳細がわからない場合は、ソースコード(read_builtinの関数builtins/read.def)を読んでください。

TCGETSioctlが返されるという事実ENOTTYは、アプリケーションが入力が端末ではないことを知る方法です。これは予想されます。関数がエラー状態を返しても問題が発生したという意味ではありません。

関連情報