Shell输入/输出重定向¶
一般情况下, 每个Linux命令运行时都会打开三个文件:
- 标准输入文件(
stdin): 文件描述符为0, 命令从stdin读取数据, 默认情况下是终端;- 标准输出文件(
stdout): 文件描述符为1, 命令向stdout输出数据, 默认情况下也是终端;- 标准错误文件(
stderr): 文件描述符为2, 命令向stderr写入错误信息, 默认情况下也是终端.
重定向命令列表如下:
command < file |
将标准输入重定向到file |
command > file |
将标准输出重定向到file, |
command >> file |
将标准输出以追加的方式重定向到file |
command 2> file |
将标准错误重定向到file |
command 2>> file |
将标准错误以追加的方式重定向到file |
m>&n |
将输出m和n合并 |
<< tag |
将开始标记tag和结束标记tag之间的内容作为输入 |
m>&n¶
表示将输出m合并到n, m和n都表示文件描述符.
例如, 将stderr合并到stderr:
# 将stderr合并到stdout
command 2&>1
# 将stderr合并到stdout,然后重定向到file
command >> file 2&>1
Here Document¶
Here Document是Shell中的一种特殊的重定向方式, 用来将输入重定向到一个交互式脚本或者程序.
它的基本形式如下:
command << delimiter
document
delimiter
它的作用是将两个delimiter之间的内容(document)作为输入传递给command.
注解
- delimiter可以是任意的名称, 但为了可读性, 最好选用恰当的名称且不要和关键字冲突;
- 结尾的delimiter一定要顶格写, 前面不能有任何字符, 后面也不能有任何字符, 包括空格和tab缩进;
- 开始的delimiter前后的空格会被忽略掉.
Example:
# 在命令行中通过wc -l命令计算行数
wc -l << EOF
Hello
World
EOF
# 输出结果为2
也可以写在脚本中:
#! /usr/bin/env bash
cat << Tag
Hello
,
World
Tag
/dev/null文件¶
如果希望执行某个命令, 但又不希望在屏幕上显示输出结果, 那么可以将输出重定向到/dev/null:
command > /dev/null
/dev/null是一个特殊的文件, 写入到它的内容都会被丢弃; 如果尝试冲该文件读取内容, 什么也读不到.
但是/dev/null文件非常有用, 将命令的输出重定向到它, 会起到”禁止输出”的效果.
如果希望屏蔽stdout和stderr, 可以这样写:
command > /dev/null 2>&1