Linux重定向及标准输入、输出、错误相关



通常情况,每个 Unix 程序在启动时都会打开三个流,一个用于输入,一个用于输出,一个用于打印诊断或错误消息。它们分别被做:标准输入,标准输出,标准错误。

标准输入是程序可以读取其输入的位置。缺省情况下,进程从键盘读取 stdin

标准输出是程序写入其输出的位置。缺省情况下,进程将 stdout 写到终端屏幕上。

标准错误是程序写入其错误消息的位置。缺省情况下,进程将 stderr 写到终端屏幕上。

 

重定向:

数据流重导向(重定向)就是将某个指令(命令)执行后的执行返回值,一般这些返回值就是你执行完后出现在屏幕上那些结果数据。如果不想让他默认流向屏幕,可以把这些结果数据传输到其他的地方,例如文件或者装置(例如打印机,不过在Linux里面一切都一切都是文件,所以打印机这样的设备也是文件)

>数据流重导向:输出导向,会替换被导向的文件内容.

>>数据流重导向:输出导向,不会替换被导向的文件内容,会累加数据.

 

文件描述符:

POSIX 定义了STDIN_FILENOSTDOUT_FILENO STDERR_FILENO 来代替 012这三个符号常量的定义位于头文件 unistd.h

标准输入 (stdin) 文件描述符为 0 ,使用 < << ;其实可以理解为这个箭头指向哪里数据就往哪里跑.这里是输入(stdin).命令就通过<来获取数据.等于数据是从左边往命令里面流.

标准输出 (stdout)文件描述符为 1 ,使用 > >> ;输出的时候不能用<或者<<,因为命令总是在前面.这里命令要输出数据.所以数据的来源是命令,数据就会随着箭头指向你给的方向.

标准错误输出(stderr)文件描述符为 2 ,使用 2> 2>>;

 

command >file 2>&1

首先command >file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file中;command>file 2>file 这样的写法,stdoutstderr都直接送到file, file会被打开两次,这样stdoutstderr会互相覆盖,这样写相当使用了两个同时去抢占file的管道.定向了2次。

那如果使用command >file 2>&1 这条命令就将stdout直接送向file,stderr 继承了第一次重定向(FD1)到管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdoutstderr的内容。


/dev/null

Linux下还有一个非凡的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null

假如想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null

>/dev/null表示将程序通过printf或者fprintf打印到handle1stdout文件的信息,送到/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

你可能感兴趣的:(Linux)