Linux I/O重定向简述

经常看到一些命令像这样的:command > /dev/null 2>&1,一开始也查了下,知道是一些输出重定向就没去了解。现在有重定向的需求,所以翻了些文章了解一下,并简单整理以备查阅。

References:

先看下常用命令的含义:

命令说明
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 &

最后的&符号表示后台运行

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……