shell 重定向

shell交互环境下,默认的标准输入和输出是stdin和stdout,即键盘和屏幕:shell中运行的程序默认从键盘读取数据,默认将数据打印到屏幕上。

通过shell的重定向符号 > ,可以将标准输出重定向到指定的文件:将打印输出到指定的文件中。

root@pc:/home/demo# echo hello
hello
root@pc:/home/demo# echo hello > log
root@pc:/home/demo# cat log
hello
root@pc:/home/demo#

再次使用 > 符号,会覆盖掉log文件中的数据。此时,我们可以使用 >> 符号,以追加的形式将数据追加到log文件末尾:

root@pc:/home/demo# echo world > log
root@pc:/home/demo# cat log 
world
root@pc:/home/demo# echo hello >> log
root@pc:/home/demo# cat log 
world
hello
root@pc:/home/demo#

通过重定向符号 <,可以从指定的文件中读取数据到标准输入,而不是从默认的键盘中读取数据。

root@pc:/home/demo# cat log 
world
hello
root@pc:/home/demo# wc -l < log
2
root@pc:/home/demo#

在Linux下运行的每一个用户进程,默认都会打开stdin、stdout、stderr这三个标准输入、标准输出、标准错误文件,对应的文件描述符分别是0、1、2。进程就是基于这三个文件描述符才能与用户进行交互的:接收用户从键盘输入的数据、或者打印数据到屏幕上。标准输入、标准输入默认是重定向到键盘和显示器上,我们可以通过重定向符号,修改标准输入、标准输出和标准错误的重定向:

root@pc:/home/demo# echo hello 1>log
root@pc:/home/demo# ls
log
root@pc:/home/demo# cat log 
hello

使用echo命令将hello字符串打印到标准输出(默认重定向到屏幕),因为此时标准输出(文件描述符为1)已经重定向到log文件,所以我们在屏幕上是看不到打印输出的,输出的hello字符串在log文件里。

如果想要把标准输出和标准错误重定向到同一个文件中,可以使用下面的命令:

root@pc:/home/demo# echo hello > log 2>&1
root@pc:/home/demo# ls
log
root@pc:/home/demo# cat log 
hello

这样设置的好处是,无论是正常的输出,还是错误输出,都可以打印到指定的log文件里。

root@pc:/home/demo# rm log 
root@pc:/home/demo# echsdhasdh > log 2>&1
root@pc:/home/demo# ls
log
root@pc:/home/demo# cat log 
echsdhasdh: command not found
root@pc:/home/demo#

这里需要注意重定向符所在的位置,如下面的重定向命令:

echo 2>&1 > log

仅仅是把标准输出重定向到了log文件中,在标准输出(文件描述符为1)被重定向到log文件之前,标准错误输出已经被复制到标准输出,所以两者是等价的。

命令 说明
command > file 将输出重定向到 file
command < file 将输入重定向到 file
command >> file 将输出以追加的方式重定向到 file
n> file 将文件描述符为 n 的文件重定向到 file
n>> file 将文件描述符为 n 的文件以追加的方式重定向到 file
n>&m 将输出文件 m 和 n 合并,如2>&1,输出和错误重定向到同一个文件
n<&m 将输入文件 m 和 n 合并
《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客