红联Linux门户
Linux帮助

Linux-文件描述符和重定向

发布时间:2014-12-29 09:37:36来源:linux网站作者:yapian8

1.预备知识
标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是编写脚本的时候经常使用的,因为输出的信息可能是上述的一种。

文件描述符 是与打开的某个文件或者数据流相关联的整数。文件描述符0,1,2是系统预留的。

0 - stdin(标准输入)
1 - stdout(标准输出)
2 - stderr(标准错误)


2.实例
echo This is a sample. > temp.txt
可将文本输出到 temp.txt 中,是通过截断文件的方式,也就是说在echo命令写入前先将文件中的内容清空。

echo This is a sample. >> temp.txt
上述命令是追加的方式。

说明重定向之前先了解一下什么是成功和不成功的命令。

当一个命令发生错误并退出的时候,它会返回一个非0的值。成功后会返回0。可以通过 $? 查看返回的值。

ls 2> out.txt
将错误输出到文件中。

你也可以这样:

cmd 2> out.txt 1> temp.txt
将标准错误和标准输出重定向到两个文件中。当然,还有更精简的方式输出到同一个文件中:

cmd 2>&1 out.txt
有时候你并不想保存错误输出,那就将它引向一个“黑洞”(/dev/null)吧,就像错误输出没有产生过一样。

这个时候,如果你既想把输出保存起来,同时又想查看输出,怎么办呢?

command | tee out.txt | cat -n
这个时候command 的结果会保存在 out.txt 中,同时也会通过管道最为标准输出向下传递。 cat -n 将结果加上行号输出。

我们也可以使用 stdin 作为命令参数。只需要将-作为命令的文件名即可。

$ echo who is this | tee -
who is this
eho is this


3.原理
默认的重定向操作符使用标准输出。因此 > 等同于 1> 。


4.补充
从 stdin 读取输入的命令能以多种方式接受数据。

将文件重定向到命令,借助重定向,我们可以像使用 stdin 那样从文件中读取数据。

$ cmd < file
自定义文件描述符:

创建一个文件描述符进行文件读取:

$ exec 3<input.txt # 使用文件描述符3打开并读取文件
我们可以这样使用它:

$ echo this is a test > input.txt
$ exec 3<input.txt
这就可以在命令中使用文件描述符3了。

$ cat <&3
this is a test
如果想再次读取就不能使用3了,需要再次分配读取。

创建文件描述符用于写入:

$ exec 4>output.txt
$ echo newline > &4
$ cat outline
newline
dev/stdin -> proc/self/fd/0 -> dev/pts/1

标准操作下的输入输出,指向了虚拟目录下当前进程的终端中。

1.2重定向&管道 原理:
重定向
$ tail -f /var/log/message  > abc
然后挂起。 ps 查看一下该进程的进程号是 15551 .

$ cat /proc/15551/fd/?
可以看到:

/proc/15551/fd/0 -> /dev/pts/1
/proc/15551/fd/1 -> /roor/test/abc #上述命令的重定向输出文件
/proc/15551/fd/2 -> /dev/pts/1
/proc/15551/fd/3 -> /var/log/message
/proc/15551/fd/4 -> inotify
重定向就是将链接指向执行的文件。

管道
将前面命令的标准输出作为后面命令的标准输入。

注意是 标准输出 也就是说,在管道传递的时候标准错误输出已经被过滤掉了。所以,前面命令的标准错误输出都会打印在终端上.

有很多命令不直接支持标准输入的形式作为输入。

$ which find | ls -l
不能输出 find 的信息。使用如下的方式即可。

$ which find | xargs ls -l