我对一个问题的回答,以及对其的评论,让我阅读了基本定义的 POSIX 一致性部分找出/dev/stdin
、/dev/stdout
和是否/dev/stderr
确实需要符合 POSIX 标准。
事实证明他们不是:
系统可能提供非标准扩展。这些是 POSIX.1-2008 不需要的功能,可能包括但不限于: [...] 具有特殊属性的附加字符特殊文件(例如,
/dev/stdin
、/dev/stdout
和/dev/stderr
)
据我所知,这是仅有的在标准中提到这些文件。
我只能访问一个没有实现它们的“系统”(实际上是环境),那就是 Windows 上的 MinGW(/dev
据我所知根本没有)。据我所知,所有免费的Unices都有它们,Cygwin、Windows的新Linux环境和Darwin/macOS也有。
不过我不太熟悉商业 Unices。
是否有一个 POSIX 系统、Unix 或某种类似 Unix 的环境,在今天仍然存在,并且不将/dev/stdin
、/dev/stdout
、 和/dev/stderr
作为文件系统中的文件实现?
答案1
是否有一个 POSIX 系统、Unix 或类似 Unix 的环境,在今天仍然存在,不将 /dev/stdin、/dev/stdout 和 /dev/stderr 作为文件系统中的文件实现?
是的,至少按照我下面的示例系统是这样。
无论如何,我都不是这个系统的专家;然而,AIX 6.1,维基百科声称是:
其版本经过 The Open Group 的 UNIX 03 标准认证的五个商业操作系统之一(https://en.wikipedia.org/wiki/IBM_AIX)
似乎没有在我有权访问的安装中实现这些文件描述符。正如您所看到的,如果使用 bash,它将表现得好像它们确实存在用于重定向目的:
$ uname -s
AIX
$ echo $SHELL
/usr/bin/ksh
$ ls -al /dev/stdin
ls: 0653-341 The file /dev/stdin does not exist.
$ ls -al /dev/stdout
ls: 0653-341 The file /dev/stdout does not exist.
$ ls -al /dev/stderr
ls: 0653-341 The file /dev/stderr does not exist.
$ echo foo >/dev/stderr
The file access permissions do not allow the specified action.
ksh: /dev/stderr: 0403-005 Cannot create the specified file.
$ bash
bash-4.2$ ls /dev/stderr
ls: 0653-341 The file /dev/stderr does not exist.
bash-4.2$ echo foo >/dev/stderr
foo
正如其他评论者提到的,以下问题也提供了一些有趣的信息:
答案2
我在最初的帖子之后就发布了,但我想我应该为未来的观众添加此评论。
在 AIX 6.1 系统上写入 /dev/stdout 得到与上面相同的结果,但在 AIX 7.1 系统上它按预期工作,因此看起来添加了对 /dev/stdout 的支持。
AIX 6.1 (ksh93)
echo "Hello" > /dev/stdout
ksh93: /dev/stdout: cannot create.
[The file access permissions do not allow the specified action.].
AIX 7.1 (ksh93)
echo "Hello" > /dev/stdout
Hello