11.4-重定向输入输出
Linux 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
重定向命令列表如下:
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入 |
1. 输出重定向
重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:
command1 > file1
上面这个命令执行command1然后将输出的内容存入file1。
注意:任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。
执行who >users 并没有显示,而是将who命令结果重定向到users文件,若文件不存在会新建一个文件。
覆盖,,已经存在的内容将被新内容替代。
使用>>操作符,将新内容添加在文件末尾。
2. 输入重定向
输入重定向是将文件的内容重定向到命令。
2.1 输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
1 command1 < file1
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
注意:上面结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。
2.2 Here Document(内联输入重定向) 一种特殊的输入重定向
Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
1 command << delimiter 2 document 3 delimiter
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:
结尾的delimiter 一定要顶格写,前面和后面都不能有任何字符(包括空格和 tab 缩进)。
开始的delimiter前后的空格会被忽略掉。
wc命令时分别输出文件的行数,单词数和字节数。
3. 重定向深入讲解(点击这里获得更多)
一般情况下,每个 Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以这样写:$command 2 > file
如果希望 stderr 追加到 file 文件末尾,可以这样写:$command 2 >> file 2 表示标准错误文件(stderr)。
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写: $command > file 2>&1或$command >> file 2>&1
如果希望对 stdin 和 stdout 都重定向,可以这样写: $command < file1 >file2 command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
不论输出标准输入或标准输出还是标准错误文件都可以输入到file中。你可以这样写: $command &>>file
4. /dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
1 command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
1 command > /dev/null 2>&1
注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
5. 重定向&操作符
重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:
1 dir>c:/file.txt 2>&1
复制句柄时,可以复制该句柄原状态的所有特性。
例如,如果一个句柄具有只读访问的属性,则该句柄的所有副本都具有只读访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。
5.1 使用 & 操作符重定向输入和副本
- 要将重定向输入操作符 (<) 与复制操作符 (&) 结合使用,指定的文件必须已经存在。
- 如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件包含的字符作为输入发送到此命令(如同从键盘输入一样)。
- 如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。
例:
要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入: <file.txt
要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:sort<file.txt
要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:indfile file.txt>search.txt 2<&1
要以句柄 0 输入读取(即 STDIN)的方式复制用户定义的句柄 3,请键入: <&3
5.2 使用 & 操作符重定向输出和复制
如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。
要将用户定义的句柄 3 复制到句柄 1,请键入:>&3
要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:ipconfig.exe>>output.log 2>&1
5.3 使用 >> 重定向操作符附加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。
例
使用下列命令可以将 dir 命令生成的目录列表附加到 Dirlist.txt 文件:dir>>dirlist.txt
要将 netstat 命令的输出附加到 Tcpinfo.txt 的末尾,请键入:netstat>>tcpinfo.txt
6. 管道操作符 |
- 管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其定向到另一个命令的输入(默认情况下是 STDIN)中。
- 管道操作符 (|) 可以再一条命令中使用任意多条|
- 管道操作符 (|) 最流行的用法之一将命令产生的大量输出通过管道传送给more命令
例 :使用如下命令可以对目录进行分类:
dir | sort
将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。
sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。