在使用Unix系统的过程中,可能大家会遇到如下这些问题:
1、在Unix系统下需要编译一个比较大的程序,估计要20分钟。在编译过程中可能会出现一些警告或者错误信息。系统工程师不可能这二十分钟都盯着屏幕看。为此系统工程师希望shell能够把这这些编译过程中出现的警告或者错误信息能够保存在一个文件中,以供系统工程师或者程序开发人员后续查询所用。
2、在开发程序的时,有时候是根据代码的行数来收费的,在Unix系统中开发应用程序也是如此。为此系统工程师也希望能够有工具能够方便的来统计某个程序文件的行数。
3、有时候系统管理员可能希望能够把几个文本文件合并起来。虽然通过复制、粘贴可以实现类似的功能。但是当需要被合并的文件比较多的时候,通过赋值粘贴来实现合并的目的,并不是很好的处理方法。等等。
以上这些问题虽然在Unix系统中没有专门的命令来解决。但是通过重定向功能,再结合其他的一些处理技巧,这些问题就迎刃而解了。
一、利用重定向功能实现文件的合并。
在Unix系统中,当要把多个文件合并为一个文件时,重定向功能就会显得特别有用。如现在系统管理员希望帮Unix系统中的A1.TXT、A2.TXT 文件合并(甚至多个文件)就可以通过重定向功能来实现。在谈具体的原理之前,笔者先把这个命令写出来。
Cat A1.TXT、A2.TXT > new.txt
这个命令的具体执行过程如下:
首先当shell发现命令行中有特殊字符时,就会把流从它的默认设备上断开。现在这个命令中有>符号时,系统就会创建一个新的文件new.txt为写入做准备。不过这里要注意一个问题,如果此时Unix系统中已经存在了这个文件,则shell会覆盖这个文件,而不会给系统管理员任何的提示。所以在利用输出重定向功能的时候,一定要谨慎。特别是最好不要以root身份来运行这个命令。因为特权用户对于系统中的所有文件与目录都有完全控制的权限。为此其运行这个命令的话,万一这个文件已经存在,则会毫不犹豫的覆盖这个文件,即使这个文件的所有者不是特权用户。
其次shell会断开默认设备。Cat命令的默认设备通常情况下就是屏幕终端。但是shell在解释命令的时候看到了命令中有特殊符号,故会断开其默认设备,而会连接到new.txt这个文件中。即把这个文件当作其默认的显示设备。注意这里是断开默认设备,连接一个新设备;而不是创建一个备份设备。也就是说,此时执行这个命令的时候,因为已经断开了与屏幕终端的连接,故这两个文件的内容不会在屏幕上显示,而直接保存到了new.txt文件中。
-------------------------
shell中可能经常能看到:>/dev/null 2>&1
命令的结果可以通过%>的形式来定义输出
/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
A. 1> /dev/null 表示将命令的标准输出重定向到 /dev/null2>/dev/null 表示将命令的错误输出重定向到 /dev/null1 - denotes stdout ( standard output )2 - denotes stderr ( standard error )/dev/null就相当与windows里的回收站,只是进去了不能再出来了。>/dev/null 就是将标准输出和标准出错的信息屏蔽不显示
B.>/dev/null 2>&1 also can write as 1>/dev/null 2>&1 - stdout redirect to /dev/null (no stdout) ,and redirect stderr to stdout (stderr gone as well) . end up it turns both stderr and stdout off
C.a little practice may help to undstand above . #ls /usr /nothing #ls /usr /nothing 2>/dev/null #ls /usr /nothing >/dev/null 2>&1
我们经常会在UNIX系统下的一些脚本中看到类似”2>&1″这样的用法,例如“/path/to/prog 2>&1 > /dev/null &”,那么它的具体含义是什么呢?
UNIX有几种输入输出流,它们分别与几个数字有如下的对应关系:0-标准输入流(stdin),1-标准输出流(stdout),2-标准 错误流 (stderr)。”2>&1″的意思就是将stderr重定向至stdout,并一起在屏幕上显示出来。如果不加数字,那么默认的重定向 动作是针对stdout(1)的,比如”ls -l > result”就等价于”ls -l 1 > result”。这样便于我们更普遍性的理解重定向过程。
阅读(1421) | 评论(0) | 转发(0) |