我应该尝试在 Bash 脚本的 strace 输出中摆脱“不适当的设备 ioctl”吗?

7 bash ubuntu io

我正在使用strace此代码:

#!/usr/bin/env bash

exec 0<test.log
while IFS= read -r line; do
    printf "%s\n" "$line"
done
Run Code Online (Sandbox Code Playgroud)

(直接<test.log重定向给出相同的结果。)

对于每个读取行,我都会收到此错误:

ioctl(0, TCGETS, 0x7fff1e645d50)        = -1 ENOTTY (Inappropriate ioctl for device)
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,是最近的答案。但这远非现场。我的脚本工作正常,我只是想知道这是我应该处理的事情还是 Bash 的标准方式。ioctl为每一行调用该函数是不是很引人注目?我有一个想法,-uBash的参数可能是相关的:

-u fd  Read input from file descriptor fd.
Run Code Online (Sandbox Code Playgroud)

我做了一些实验,无济于事。所以这个选项应该如何使用可能是另一个问题。

我在 Ubuntu 16.04 上使用 Bash 4.3.48(1)-release。

Gil*_*il' 5

你无法摆脱它,也没有理由删除它。这来自 bash 检查输入是否来自终端(它调用isatty)。仅当传递各种选项时,它实际上并不在您的情况下使用此信息。如果您对细节感到好奇,请阅读源代码(read_builtin中的函数builtins/read.def)。

TCGETSioctl 返回的事实ENOTTY是应用程序如何判断输入不是终端。这是预期的。仅仅因为函数返回错误状态并不意味着出现了问题。