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