直观的说,标准输出是命令或程序所传递的正确信息,与之对应,标准错误输出就是命令或程序运行失败后传递的错误信息。举例来说,Ubuntu 系统默认有 /etc/timezone 文件但却没有 /etc/time 文件,若设法使用 cat 命令显示这两个文件的内容,将出现以下结果:
trevor@trevor-PC:~/linux/linux100$ cat /etc/timezone Asia/Shanghai trevor@trevor-PC:~/linux/linux100$ cat /etc/time cat: /etc/time: 没有那个文件或目录 trevor@trevor-PC:~/linux/linux100$
由于系统中存在 /etc/timezone 文件,cat 命令传递的结果“Asia/Shanghai”则来自标准输出;cat 命令由于找不到 /etc/time 文件,执行失败后传递的错误信息“cat: /etc/time: 没有那个文件或目录”则来自标准错误输出。
不管是正确或者错误的数据都默认打印到屏幕上,以至于屏幕显示混乱,那么有没有办法将正确与错误的数据分开输出呢?答案是肯定的。我们可以使用数据流重定向命令来将标准输出跟标准错误输出消息分别送到指定的文件或设备上,重定向符号与标准输入输出文件描述符的对应关系如下:
标准输入(stdin) :系统为其分配的文件描述符为 0 ,使用 < 或 << 跟文件或字符串,将指定文件或字符串的内容作为输入对象; 标准输出(stdout):系统为其分配的文件描述符为 1 ,使用 > 或 >> 跟文件或设备,将标准输出内容写入指定文件或者设备; 标准错误输出(stderr):系统为其分配的文件描述符为 2 ,使用 2> 或 2>> 跟文件或设备,将标准错误输出内容写入指定文件或者设备;
为了更好的理解 stdout 跟 stderr,我们先来看一个实例:
trevor@trevor-PC:~/linux/linux100$ ls -l 总用量 4 drwxr-xr-x 3 trevor trevor 4096 2012-01-09 17:27 06 trevor@trevor-PC:~/linux/linux100$ ls -l > test trevor@trevor-PC:~/linux/linux100$ cat test 总用量 4 drwxr-xr-x 3 trevor trevor 4096 2012-01-09 17:27 06 -rw-r--r-- 1 trevor trevor 0 2012-02-23 21:28 test trevor@trevor-PC:~/linux/linux100$ mkdir newdir trevor@trevor-PC:~/linux/linux100$ ls -l > test trevor@trevor-PC:~/linux/linux100$ cat test 总用量 8 drwxr-xr-x 3 trevor trevor 4096 2012-01-09 17:27 06 drwxr-xr-x 2 trevor trevor 4096 2012-02-23 21:28 newdir -rw-r--r-- 1 trevor trevor 0 2012-02-23 21:28 test trevor@trevor-PC:~/linux/linux100$ rm newdir/ -r trevor@trevor-PC:~/linux/linux100$ ls -l >> test trevor@trevor-PC:~/linux/linux100$ cat test 总用量 8 drwxr-xr-x 3 trevor trevor 4096 2012-01-09 17:27 06 drwxr-xr-x 2 trevor trevor 4096 2012-02-23 21:28 newdir -rw-r--r-- 1 trevor trevor 0 2012-02-23 21:28 test 总用量 8 drwxr-xr-x 3 trevor trevor 4096 2012-01-09 17:27 06 -rw-r--r-- 1 trevor trevor 174 2012-02-23 21:28 test trevor@trevor-PC:~/linux/linux100$
我们发现,在使用重定向符号 > 跟 >> 时,屏幕没有任何显示,其后面跟的文件 test 原本不存在,后来被创建,这是因为原本“ls -l”命令显示的数据已经被重新导向到 test 文件中去了,执行“cat test”命令,便可查看原本应该显示到屏幕上的数据。接着创建一个名为 newdir 的新目录,执行“ls -l > test”命令,“cat test”发现新的输出结果覆盖了原有内容。我们可以得出这样的结论:如果指定的文件不存在,该文件将被创建,且输出结果被保存在其中;如果该文件已存在,则输出内容将会覆盖文件中的原有内容。与重定向符号 > 相比,>> 的不同在于:如果指定文件存在,输出内容将被追加到文件中原有内容的后面,而不会将其覆盖。
上面演示的是来自 stdout 的数据重定向实例,专门针对正确数据;如果想重定向来自 stderr 的数据,相似的方式,使用重定向符号“2>”或“2>>”即可。我们观察到,“2>”中的 2 即代表系统为 stderr 分配的文件描述符 2,类似的,我们可以使用“1>”来重定向来自 stdout 的数据,也就是说,“1>”与“>”,“1>>”与“>>”都是等价的。
那么怎样同时将标准输出信息跟标准错误信息同时输出到不同文件呢?来看看下面这个实例:
trevor@trevor-PC:~/linux/linux100$ ls 06 trevor@trevor-PC:~/linux/linux100$ cat /etc/timezone/etc/time Asia/Shanghai cat: /etc/time: 没有那个文件或目录 trevor@trevor-PC:~/linux/linux100$ cat /etc/timezone/etc/time > good 2> error trevor@trevor-PC:~/linux/linux100$ ls 06 error good trevor@trevor-PC:~/linux/linux100$ cat good Asia/Shanghai trevor@trevor-PC:~/linux/linux100$ cat error cat: /etc/time: 没有那个文件或目录 trevor@trevor-PC:~/linux/linux100$
我们发现,使用 cat 命令显示 /etc/timezone 跟 /etc/time 时,第一个文件内容正确显示了,显示第二文件时候提示错误。第二次使用数据流重定向命令“>”和“2>”分别将正确信息跟错误信息输出到good跟error文件中,使用 cat 命令查看后,发现跟我们预期的一样,即同时将标准输出信息跟标准错误信息同时输出到不同文件中去。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。