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