前言
在学习重导向之前,请先了解什么是文件描述符。
查看一个进程打开了哪些文件,可以通过/proc/[pid]/fd目录查看。其中,pid是这个进程的进程号。
例如:我在终端tty2执行命令
$ less /var/log/dpkg.log
然后在终端tty1执行命令
$ ps -e | grep less
107 tty2 00:00:00 less
$ ls -al /proc/107/fd
total 0
dr-x------ 2 felix felix 0 Jul 5 14:20 .
dr-xr-xr-x 7 felix felix 0 Jul 5 14:20 ..
lrwx------ 1 felix felix 0 Jul 5 14:20 0 -> /dev/tty2
lrwx------ 1 felix felix 0 Jul 5 14:20 1 -> /dev/tty2
lrwx------ 1 felix felix 0 Jul 5 14:20 2 -> /dev/tty2
lr-x------ 1 felix felix 0 Jul 5 14:20 3 -> /dev/tty
lr-x------ 1 felix felix 0 Jul 5 14:20 4 -> /var/log/dpkg.log
less进程的pid为107,打开了三个文件。其中标准输入(file descriptor 0)、标准输出(file descriptor 1)和标准错误(file descriptor 3)都是终端tty2,在file descriptor 3打开的是另一个终端tty,在file descriptor 打开的是文件/var/log/dpkg.log.
再举一个例子,我在终端tty2执行命令
$ cat /var/log/dpkg.log|less
然后在终端tty1执行命令
$ ps -e
PID TTY TIME CMD
1 ? 00:00:00 init
72 tty2 00:00:00 init
73 tty2 00:00:00 bash
115 tty1 00:00:00 init
116 tty1 00:00:00 bash
165 tty2 00:00:00 cat
166 tty2 00:00:00 less
168 tty1 00:00:00 ps
$ ls -al /proc/165/fd
total 0
dr-x------ 2 felix felix 0 Jul 5 14:40 .
dr-xr-xr-x 7 felix felix 0 Jul 5 14:40 ..
lrwx------ 1 felix felix 0 Jul 5 14:40 0 -> /dev/tty2
l-wx------ 1 felix felix 0 Jul 5 14:40 1 -> 'pipe:[178]'
lrwx------ 1 felix felix 0 Jul 5 14:40 2 -> /dev/tty2
lr-x------ 1 felix felix 0 Jul 5 14:40 3 -> /var/log/dpkg.log
$ ls -al /proc/166/fd
total 0
dr-x------ 2 felix felix 0 Jul 5 14:40 .
dr-xr-xr-x 7 felix felix 0 Jul 5 14:40 ..
lr-x------ 1 felix felix 0 Jul 5 14:40 0 -> 'pipe:[178]'
lrwx------ 1 felix felix 0 Jul 5 14:40 1 -> /dev/tty2
lrwx------ 1 felix felix 0 Jul 5 14:40 2 -> /dev/tty2
lr-x------ 1 felix felix 0 Jul 5 14:40 3 -> /dev/tty
我们可以看到,cat进程在file descriptor 3上打开了文件/var/log/dpkg.log,cat进程的标准输出和less进程的标准输入通过pipe:[178]连接。
<未完待续>