解决方案:
linux空设备文件和重定向
输出/输入重导向
> >> < << :> &> 2&> 2<>>& >&2
文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。
常用的文件描述符如下:
文件描述符 名称 常用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕
/dev/null代表空文件设备
1表示系统标准输出,系统默认值是1, > /dev/null等同于:1 > /dev/null
对于 >dev/null 2>&1
1>/dev/null:首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息.
2>&1:标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件.
command > file 2>file 与 comand >file 2>&1:
command > file 2>file:的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file的管道.
command >file 2>&1:这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法.
Linux Shell 环境中支持输入输出重定向,用符号<和>来表示。0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>a.txt 表示将错误信息输出到文件a.txt中。
同时,还可以在这三个标准输入输出之间实现重定向,比如将错误信息重定向到标准输出,可以用 2>&1来实现。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如:
# ls 1>/dev/null 2>/dev/null
还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如:
# ls >/dev/null 2>&1
注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null。
举例:
hadoop distcp hdfs://hadoop:8020$dir hdfs://hadoop1:8020/hive/warehouse/ >/data2/xr/log/distcp.log 2>&1
表达标准输出到/data2/xr/log/distcp.log文件中,2>&1:把标准错误输出(2)到/data2/xr/log/distcp.log中.
1. COMMAND_OUTPUT > 文件夹
a) 重定向stdout到一个文件.
b) 如果没有这个文件就创建, 否则就覆盖.
2. ls -lR > dir-tree.list
a) 创建一个包含目录树列表的文件.
3. : > filename
a) > 会把文件"filename"截断为0长度.
b) 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
c) : 是一个占位符, 不产生任何输出.
4. > filename
a) > 会把文件"filename"截断为0长度.
b) 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
c) (与上边的": >"效果相同, 但是在某些shell下可能不能工作.)
5. COMMAND_OUTPUT >> 文件夹
a) 重定向stdout到一个文件.
b) 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.
6. 1>filename
a) 重定向stdout到文件"filename".
7. 1>>filename
a) 重定向并追加stdout到文件"filename".
8. 2>filename
a) 重定向stderr到文件"filename".
9. 2>>filename
a) 重定向并追加stderr到文件"filename".
10. &>filename
a) 将stdout和stderr都重定向到文件"filename".
11. bad_command1 2>$ERRORFILE
a) 错误消息发到$ERRORFILE中.
12. bad_command2 2>>$ERRORFILE
a) 错误消息添加到$ERRORFILE中.
b) 每行过后, 这些重定向命令也会自动"reset".
13. 2>&1
a) 重定向stderr到stdout.
b) 得到的错误消息与stdout一样, 发送到一个地方.
14. i>&j
a) 重定向文件描述符i 到 j.
b) 指向i文件的所有输出都发送到j中去.
15. >&j
a) 默认的, 重定向文件描述符1(stdout)到 j.
b) 所有传递到stdout的输出都送到j中去.
16. 0< FILENAME
17. <FILENAME
a) 从文件中接受输入.
b) 与">"是成对命令, 并且通常都是结合使用.
18. |
a) 管道.
b) 通用目的的处理和命令链工具.
c) 与">"很相似, 但是实际上更通用.
d) 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
e) cat *.txt | sort | uniq > result-file
f) 对所有的.txt文件的输出进行排序, 并且删除重复行,
g) 最后将结果保存到"result-file"中.
19. ls -yz >> command.log 2>&1
a) 将错误选项"yz"的结果放到文件"command.log"中.
b) 因为stderr被重定向到这个文件中,
c) 所有的错误消息也就都指向那里了.
d) 注意, 下边这个例子就不会给出相同的结果.
20. ls -yz 2>&1 >> command.log
a) 输出一个错误消息, 但是并不写到文件中.
b) 如果将stdout和stderr都重定向,
c) 命令的顺序会有些不同.
Name:Xr
Date:2014-05-31 23:02