这个是数据流重定向操作的符号,就是将命令行屏幕上的标准输出或标准错误输出数据传送到一个文件或设备中,。通俗点来说就是,执行一个命令,本应该显示在屏幕上的结果,重定向到文件或设备。例如:
创新互联公司专注于宁海网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供宁海营销型网站建设,宁海网站制作、宁海网页设计、宁海网站官网定制、微信小程序开发服务,打造宁海网络公司原创品牌,更为您提供宁海网站排名全网营销落地服务。
ls
/etc
mydata
记住:(一个大于符号)表示以覆盖的方式重定向数据,意思就是如果大于号后面跟的文件里有数据,会被覆盖掉。
(两个大于符号)表示以追加的方式重定向数据,就是后面跟的文件如果有数据,重定向数据会在其后面追加。例子:
ls
/usr
mydata
首先说一下什么是数据流重定向,所谓数据流重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本。
谈到数据流重定向,我们首先需要了解文件描述符的概念。对于linux内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程等返回一个文件描述符。按照惯例,unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。总结如下:
标准输入:文件描述符0,通常指键盘的输入 。使用符号或
标准输出:文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号或
标准错误:文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2或2
默认情况下和分别表示1或1,和与0和0等价。
标准输出重定向:
#ls
表示列出当前目录条目,并将结果输出到屏幕。
#ls 1file1
以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。
即这个命令等同于
#ls file1
如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用。表示将重定向数据追加到file1文件的末尾。
标准错误重定向:
#ls -qw 2errorfile
表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为与1等同,默认是标准输出重定向。所以这里要写成2,表示标准错误重定向。-qw用来产生错误信息。
把标准错误和标准输出写入同一个文件:
#./a.out outfile
这个命令把./a.out的标准输出和标准错误重定向到outfile。在这里表示标准错误和标准输出。下面是另一种写法:
#./a.out outfile 21
下面是一个错误的例子:
#./a.out outfile 2outfile
标准输入重定向:
#grep search-world filename 或 grep search-world 0filename
还有下面这种方式:
cat catfile ~/.bashrc
它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile
关闭文件:
"-"表示关闭文件标识符
有关关闭文件标识符的操作请参考下面
n- 关闭输入文件标识符n
0-或- 关闭标准输入stdin
n- 关闭输出文件标识符n
1-或-关闭标准输出stdout
屏蔽标准输出或标准错误:
./a.out /dev/null #等同于./a.out 1dev/null 表示屏蔽标准输出
./a.out 2/dev/null #表示屏蔽标准错误
./a.out /dev/null 2/dev/null #表示同时屏蔽标准输出和标准错误
打开文件:
#exec 3filename 把文件filename打开,并指定文件标识符为3
命令jfilename表示把文件打开,并指明文件标识符为j
我们什么时候需要重定向:
1.屏幕输出的信息很重要,而且我们需要将它存下来的时候。
2. 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。
3. 一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。
4. 一些执行命令的可能已知错误信息时,想以“2dev/null"将它丢掉
5. 错误信息与正确信息需要分别输出时
常用重定向命令:
cmd file 把 stdout 重定向到 file 文件中;
cmd file 把 stdout 重定向到 file 文件中(追加);
cmd 1 fiel 把 stdout 重定向到 file 文件中;
cmd file 21 把 stdout 和 stderr 一起重定向到 file 文件中;
cmd 2 file 把 stderr 重定向到 file 文件中;
cmd 2 file 把 stderr 重定向到 file 文件中(追加);
cmd file 21 把 stderr 和 stderr 一起重定向到 file 文件中(追加);
cmd file file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
cat file 以读写的方式打开 file;
cmd file cmd 命令以 file 文件作为 stdin;
cmd delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。
n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
n 标准输入复制自文件描述符 n;
- 关闭标准输入(键盘);
- 关闭标准输出;
n- 表示将 n 号输入关闭;
n- 表示将 n 号输出关闭;
与重定向相关的题目:
此题来自《unix环境高级编程》(第3版)P73 3.5
在Bourne shell、Bourne-again shell 和Korn shell中,digit1digit2表示将描述符digit1的重定向至描述符digit2的同一文件。请说明下面两条命令的区别。
./a.out outfile 21
./a.out 21 outfile
答:因为shell从左到右处理命令行,所以:
./a.out outfile 21 等同于./a.out 1outfile 21
首先执行 outfile 设置标准输出到outfile,然后执行21,即调用dup将标准输出复制到描述符2(标准错误上),其结果是将标准输出和标准错误设置为同一个文件,即描述符1和2指向同一个文件表项。而对于命令行
./a.out 21 outfile
首先执行dup,所以描述符2成为终端(假设命令是交互执行的),标准输出重定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件表项。
参考资料:
1.
2.
3.
4.《unix环境高级编程》
相似处为,都是将前者的输出作为后者的输入。
不同处为,管道一般是将前者的输出作为后者的参数,一般应用在连续的命令中,简化人工输入参数的过程。
而数据流定向,一般是将前者命令的输出结果定向到某文件或设备中,并可以通过数据流定向将标准输出与错误输出进行调整,以达到某种目的,如静默,等。