Linux I/O重定向简述
经常看到一些命令像这样的:command > /dev/null 2>&1
,一开始也查了下,知道是一些输出重定向就没去了解。现在有重定向的需求,所以翻了些文章了解一下,并简单整理以备查阅。
References:
- http://www.runoob.com/linux/linux-shell-io-redirections.html 菜鸟教程简介
- https://www.ibm.com/developerworks/cn/linux/l-iotips/index.html IBM developerWorks(这个IBM知识库是真的好,很多文章质量都非常高)
先看下常用命令的含义:
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
NOTE:文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。另外3-9是保留的标识符,可以把这些标识符指定成标准输入,输出或者错误作为临时连接。通常这样可以解决很多复杂的重定向请求。
输出重定向:
$ command > file
上面这个命令执行command然后将输出的内容存入file。
注意任何file内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。
例如执行ls ~ > ~/dirlist.txt
在屏幕将不会有显示,输出的内容将在~/dirlist.txt
文件中。
因此清空一个文件的方式可以是:echo "" > fileName
。(这种方式清空文件会有一行空行,下文还有一种方式无空行的)
输入重定向:
$ command < file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
如果希望对 stdin 和 stdout 都重定向,可以这样写:
$ command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到/dev/null
,/dev/null
是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是/dev/null
文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
一些小技巧:
$ ls /dev 1>filename
以上命令会把命令的标准输出重新定向到一个文件filename,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。如果把上面例子重的">"改成">>"则表示把输出追加到filename文件的末尾,如果文件不存在则创建它。如下:
$ ls /dev >>filename
重新定义标准输入,输出,和错误的文件标识符
重新定义文件标识符可以用i>&j
命令,表示把文件标识符i重新定向到j,你可以把"&"理解为"取地址"
请看以下例子
$ exec 5>&1
表示把文件标识符5定向到标准输出,这个命令通常用来临时保存标准输入。
以下命令是把标准输出和错误都定向到文件
$ ls /dev &>filename
"&"在这里代表标准输出和标准错误,这里无论是正常输出还是错误信息都写到filename中了。&>file
是一种特殊的用法,也可以写成>&file
,二者的意思完全相同,都等价于
>file 2>&1
清空文件:
$ :> filename
或者
$ > filename
如果文件不存在,则创建一个空文件,(等同于touch命令),:
表示一个空输出,两个命令的唯一区别就是>filename
不是在所有shell都可以正常工作的。
关于文件标识符的其他用法可以参考IBM的文章。
这样,在后台运行一个程序,并将输出重定向到文件的命令如下:
$ command >out.file 2>&1 &
最后的&符号表示后台运行