通常情况,每个 Unix 程序在启动时都会打开三个流,一个用于输入,一个用于输出,一个用于打印诊断或错误消息。它们分别被做:标准输入,标准输出,标准错误。
标准输入是程序可以读取其输入的位置。缺省情况下,进程从键盘读取 stdin 。
标准输出是程序写入其输出的位置。缺省情况下,进程将 stdout 写到终端屏幕上。
标准错误是程序写入其错误消息的位置。缺省情况下,进程将 stderr 写到终端屏幕上。
重定向:
数据流重导向(重定向)就是将某个指令(命令)执行后的执行返回值,一般这些返回值就是你执行完后出现在屏幕上那些结果数据。如果不想让他默认流向屏幕,可以把这些结果数据传输到其他的地方,例如文件或者装置(例如打印机,不过在Linux里面一切都一切都是文件,所以打印机这样的设备也是文件)。
>数据流重导向:输出导向,会替换被导向的文件内容.
>>数据流重导向:输出导向,不会替换被导向的文件内容,会累加数据.
文件描述符:
POSIX 定义了STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。
标准输入 (stdin) :文件描述符为 0 ,使用 < 或 << ;其实可以理解为这个箭头指向哪里数据就往哪里跑.这里是输入(stdin).命令就通过<来获取数据.等于数据是从左边往命令里面流.
标准输出 (stdout):文件描述符为 1 ,使用 > 或 >> ;输出的时候不能用<或者<<,因为命令总是在前面.这里命令要输出数据.所以数据的来源是命令,数据就会随着箭头指向你给的方向.
标准错误输出(stderr):文件描述符为 2 ,使用 2> 或 2>>;
command >file 2>&1
首先command >file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file中;command>file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了两个同时去抢占file的管道.定向了2次。
那如果使用command >file 2>&1 这条命令就将stdout直接送向file,stderr 继承了第一次重定向(FD1)到管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
/dev/null
Linux下还有一个非凡的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
假如想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null
>/dev/null表示将程序通过printf或者fprintf打印到handle为1的stdout文件的信息,送到/dev/null空洞文件。
实例:
crontab 调度,显示标准和出错信息到一个输出文件。
[hadoop@emr-worker-8 sdk-dataproc]$ crontab -l
0 6 * * * sh /home/hadoop/sdk-dataproc/sdk-ctl.sh >>/home/hadoop/sdk-dataproc/corn-err.txt 2>&1