问题二、文件重定向?

原创
2014/05/31 23:01
阅读数 38


解决方案:

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部