有时,我需要指定标准 IO 流 ( stdin, stdout, stderr)之一的“等效路径” 。因为我 99% 的时间都在使用 Linux,所以我只是/dev/在准备 get/dev/stdin等,而这“似乎做对了”。但是,一方面,我一直对这样的理由感到不安(因为,当然,“它似乎有效”,直到它没有为止)。此外,我对这种操作的便携性没有很好的了解。
所以我有几个问题:
在Linux中的情况下,它是安全(是/否)划上等号stdin,
stdout以及stderr用/dev/stdin,/dev/stdout和
/dev/stderr?
更一般地说,这个等价物是否“足够便携”?
我找不到任何 POSIX 参考。
我一直想知道这一点,但从来没有花时间去了解,所以我现在就这样做 -此处显示的/proc/$$/fd/$N或的用法有多便携/dev/fd/$N?我理解POSIX 保证 /dev/null, /dev/tty, and /dev/console (尽管我前几天在阅读了这个答案的评论后才发现这一点)但是其他的呢?
据我所知,它们很常见,但我不能指望在哪些系统中找到它们?为什么不?找到一个比另一个更有可能吗?他们会总是表现出类似的属性吗?
我倾向于以各种方式广泛使用这些设备,我想知道是否有机会尝试一下。
此外,上述问题应该被理解为只是我想我想知道的,但是,因为我显然首先要问,所以我在这方面可能不是最了解的,它们不应该被视为严格的要求一个答案。如果可以,请告诉我。
我有一个 bash 脚本,它想/dev/stdout在用其他位置替换第一个文件描述符之前保留原始位置。
所以,很自然地,我写了一些类似的东西
old_stdout=$(readlink -f /dev/stdout)
Run Code Online (Sandbox Code Playgroud)
它没有用。很快我就明白了问题所在:
test@ubuntu:~$ echo $(readlink -f /dev/stdout)
/proc/5175/fd/pipe:[31764]
test@ubuntu:~$ readlink -f /dev/stdout
/dev/pts/18
Run Code Online (Sandbox Code Playgroud)
显然,$()在子外壳中运行,该子外壳通过管道传输到父外壳。
所以问题是:是否有一种可靠的(范围限于 Linux 发行版之间的可移植性)方法来将/dev/stdout位置保存为 bash 脚本中的字符串?
当您 fork 一个进程时,子进程继承其父进程的文件描述符。我知道当发生这种情况时,子进程会收到一份父文件描述符表的副本,每个表中的指针都指向相同的打开文件描述。这是与文件表相同的东西,如http://en.wikipedia.org/wiki/File_descriptor,还是其他东西?