在“测试文件描述符是否有效”问题中,寻求测试文件描述符是否打开的测试。
答案都集中在测试文件描述符是否打开用于输出,但如何测试文件描述符是否打开用于输入?
这出现在评论线程中,以回答另一个问题,其中答案说,释义,
if [ -n "$1" ]; then
# read input from file "$1" (we're assuming it exists)
elif [ ! -t 0 ]; then
# read input from standard input (from pipe or redirection)
else
# no input given (we don't want to read from the terminal)
fi
问题[ ! -t 0 ]
在于,-t
如果文件描述符打开并与终端相关联,则测试为真。如果测试为假,那么描述符要么关闭,要么与终端无关(即我们正在从管道或重定向中读取)。因此,测试并[ ! -t 0 ]
不能保证文件描述符甚至是有效的。
如何确定它是否有效(这样read
就不会抱怨)或它是否已关闭?
read(fd, 0, 0)
在 C 中使用或很容易进行检查(fcntl(fd, F_GETFL) & O_WRONLY) == 0
。我无法欺骗任何标准实用程序来做到这一点,所以这里有一些可能的解决方法。在 linux 上,您可以使用
/proc/PID/fdinfo/FD
:在 OpenBSD 和 NetBSD 上,您可以使用
/dev/fd/FD
和dd
零计数:在 FreeBSD 上,默认情况下只提供前 3 个 fd
/dev/fd
;您应该安装fdescfs(5)
或/dev/fd
:笔记:
在某些系统上,
bash
它是否模拟/dev/fd/FD
,因此cat </dev/fd/7
可能与cat /dev/fd/7
. 同样的警告适用于gawk
.read(2)
长度为 0(或其标志中没有)的 A 将open(2)
不会更新访问时间或任何其他时间戳。O_TRUNC
在 linux
read(2)
上, a 在目录上总是会失败,即使它是在没有O_DIRECTORY
标志的情况下打开的。在其他 Unix 系统上,一个目录可以像另一个文件一样被读取。该标准未指定是否从文件中
dd count=0
复制任何块或所有块:前者是 GNU dd (gdd
) 和dd
from *BSD 的行为。这似乎适用于 linux bash