当尝试使用“某个数字大于”语法(例如foo 2> myfile
)重定向程序输出时,这里可能的数字是什么以及它们代表什么?
我相信1是/dev/stdout
,2是/dev/stderr
。 5和6呢?是否有 3、4 或大于 6 的数字?
答案1
这个假定的程序将写入您指定的文件描述符号。考虑以下 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) ;
}
编译它
me@mybox:~/tmp7$ make hw
cc hw.c -o hw
现在简单的运行
me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5
5 没有文件,因此没有写入字节。
下次尝试:
me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde
我设法在指定文件和文件描述符(例如5>u
)时获得输出。
在实践中,除非您编写了上面这样有趣的程序,否则您不太可能使用5>foo
.
在 shell 脚本中,使用 <( ) 构造更有用:
diff <( cmd -par 1 ) <(cmd -par 2)
答案2
这些数字代表文件描述符(已打开的文件的句柄)。
外壳通常自动设置3个,
0 - 标准输入 1 - 标准输出 2 - 标准错误
但可以打开更多文件,并且数字会增加。
答案3
这些数字是文件描述符。正如您所指出的,有几个是自动创建的。当其他文件或类似文件的东西被打开时,它们将获得其他数字。
任何特定程序中使用的数字取决于该程序已打开或以其他方式使用的文件。例如,如果您想“保存”当前的标准输入并暂时从其他地方重定向标准输入,然后稍后恢复它,您可以执行以下操作:
exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate
所以这个脚本将有一个4
文件描述符至少在一段时间内可用。不过,这 4 可以是任何未使用的文件(嗯,一个进程可以打开的文件数量是有限制的,但可以是该限制内的任何文件)。
您可以通过查看 来了解进程打开了哪些文件描述符以及它们打开的位置/proc/<pid>/fd
。这显示了该进程的所有打开的文件描述符<pid>
以及与这些文件关联的文件。
答案4
任何进程都获取整数作为文件描述符,其中 POSIX 中保留了 3 个:0 是 stdin,1 是 stdout,2 是 stderr。任何其他文件将被分配更多编号。您可以使用此程序轻松检查,将其另存为fdtest.c,以便它在运行时打开自己的程序代码:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int fd = open("fdtest.c", O_RDONLY);
printf("%d\n", fd);
close(fd);
return 0;
}
编译它:
gcc fdtest.c -o fdtest
运行:
./fdtest
您将得到的输出是这样的:
3
...这是变量引用的文件的文件描述符的编号fd
。