程序输出重定向

Fer*_*ent 11 io-redirection file-descriptors fifo

当尝试使用“某个数字大于”语法(例如foo 2> myfile)重定向程序输出时,这里可能的数字是什么?它们代表什么?

我相信1是/dev/stdout,2是/dev/stderr。5和6呢?是否有 3、4 或某个大于 6 的数字?

Arc*_*mar 11

这个假定的程序将写入您指定的文件描述符编号。考虑以下 hello world 程序:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}
Run Code Online (Sandbox Code Playgroud)

编译它

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw
Run Code Online (Sandbox Code Playgroud)

现在一个简单的运行

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5
Run Code Online (Sandbox Code Playgroud)

没有 5 个文件,所以没有写入字节。

下一次尝试:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde
Run Code Online (Sandbox Code Playgroud)

我设法在指定文件和文件描述符(例如5>u)时获得输出。

在实践中,除非你写过像上面这样有趣的程序,否则你不太可能使用5>foo.

在 shell 脚本中,使用 <( ) 构造更有用:

 diff <( cmd -par 1 ) <(cmd -par 2)
Run Code Online (Sandbox Code Playgroud)


X T*_*ian 10

数字代表文件描述符(已打开文件的句柄)。

外壳通常有3套自动,

0 - 标准输入 1 - 标准输出 2 - 标准错误

但是可以打开更多文件,并且数字会增加。


Eri*_*ouf 8

这些数字是文件描述符。正如您所指出的,有几个是自动创建的。当打开其他文件或类似文件的东西时,它们将获得其他数字。

任何特定程序中使用的数字取决于该程序已打开或以其他方式使用的文件。例如,如果您想“保存”当前的标准输入并从其他地方临时重定向标准输入然后稍后恢复它,您可以执行以下操作:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate
Run Code Online (Sandbox Code Playgroud)

所以这个脚本4至少会有一个文件描述符可用一段时间。不过,这 4 个可能是任何未使用的东西(嗯,一个进程可以打开的文件数量是有限制的,但在该限制内的任何文件)。

您可以查看进程打开了哪些文件描述符,以及通过查看/proc/<pid>/fd. 这显示了该进程的所有打开的文件描述符<pid>以及这些文件与哪些文件相关联。