我是否应该尝试在 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是应用程序如何判断输入不是终端。这是预期的。仅仅因为函数返回错误状态并不意味着出现了问题。

相关内容