web-dev-qa-db-ja.com

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)

私はいくつかの調査を行いました this が最も近い答えです。しかし、それはスポットオンになるにはほど遠いです。私のスクリプトは正常に動作します。これが私が対処する必要があるものなのか、それともBashの標準的な方法なのか疑問に思っています。 ioctl関数が各行で呼び出されるのは印象的ではありませんか? -u Bashのパラメーターは関連している可能性があります:

-u fd  Read input from file descriptor fd.

私は役に立たないようにいくつかの実験をしました。したがって、このオプションがどのように使用されることになっているのかは、別の問題かもしれません。

私はBash 4.3.48(1)リリースのUbuntu 16.04を使用しています。

5
user147505

あなたはそれを取り除くことができず、とにかくそれを削除する理由はありません。これは、入力が端末からのものであるかどうかをbashでチェックすることから来ます(それは isatty を呼び出します)。実際にこの情報を使用するのは、さまざまなオプションが渡された場合のみです。詳細に興味がある場合は、ソースコード(read_builtin関数builtins/read.def)。

TCGETS ioctlがENOTTYを返すのは、アプリケーションが入力が端末ではないことを通知する方法です。予想通りです。関数がエラーステータスを返すからといって、何かが間違っているというわけではありません。