Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59649
  • 博文数量: 26
  • 博客积分: 315
  • 博客等级: 二等列兵
  • 技术积分: 299
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-05 17:32
文章分类
文章存档

2014年(13)

2013年(3)

2012年(10)

我的朋友

分类: 系统运维

2012-08-24 10:24:35


摘自:[]Harley HahnUnix & Linux大学教程


十、标准I/O:重定向和管道

 

1)标准输入、标准输出和标准错误

标准输入是读取数据的通用方法,标准输出用于正常输出,标准错误用于错误信息。

 

2)重定向输出 >(大于号)

如果希望命令的输出写入到文件中,在命令的后面输入>(大于号)字符,后面接文件名称即可。当以这种方式将命令输出写入到文件中,文件如不存在将创建,存在则替换。

>>告诉shell将新数据追加到文件尾部

 

3)防止文件被重定向替换或创建

设置noclobber功能

Bourne shell: set -o noclobber  复位:set +o noclobber

C-shell: set noclobber         复位:unset noclobber

临时忽略noclobberBourne shell>|来取代>C-shell>!

 

4)重写向标准输入<

sort < names

标准输入和标准输出重定向可同时指定,如

sort < rawdata > report

这个命令从rawdata中读取数据,排序之后输出到report中。

 

5)文件描述符、标准错误转出重定向

Unix进程中,每个输入源和输出目标都有一个唯一的数字标识,这个数字称为文件描述符( file descriptor )

默认情况下,Unix为每个进程提供3个预定义的文件描述符,0代表标准输入,1代表标准输出,2代表标准错误。

用法:command 0< inputfile

command 1> outfile

command 2> errorfile

其中command是命令,inputfile, outputfile, errorfile是文件名称,01可省略。

可以在同一条命令中使用多个重定向,如:

sort 0< rawdata 1>results 2>errors

sort < rawdata  >results 2>errors

有时候,可能希望在子shell中运行一小组命令或者一条命令,但又不希望启动一个全新的shell,可以将命令括在圆括号中。如:

(date)

位于圆括号中的这些命令被称为一个编组。使用编组和子shell最常见的原因是防止cd命令影响当前的shell,其通用格式为:

(cd directory; command)

对于C-shell家族,重定向标准错误的语法为

command >& outputfile

当使用>&时,shell将同时重定向标准输出和标准错误,所以使用

(command > outputfile) >& errorfile 重定向标准错误。

 

6)组合标准输出和标准错误

C-shell >&>>&

Bourne shell: command x>outputfile y>&x

对于Bash,可用&>或者>&同时定向标准输出和标准错误,但如果希望使用追加功能,则必须使用Bourne shell通用模式,如:

sort >> output 2>&1

 

7)抛弃输出

将数据输出到 /dev/null,例

update > /dev/null

Bourne shell抛弃所有输出,如: update > /dev/null 2>&1

C-shell抛弃标准错误 update > /dev/tty >& /dev/null

特殊文件/dev/tty表示终端

 

8)管道线

shell允许创建一序列命令,在这一序列命令中,一个程序的标准输出可以自动地发送给下一个程序的标准输入。当这样做时,两个程序之间的连接就是管道,而命令序列本身被称为管道线。

将标准输出和标准错误组合在一起,然后发送给下一个程序

Bourne shell: command1 2>&1 | command2

C-shell: command1 |& command2

 

9)管道线分流:tee

有时候,可能希望将程序的输出同时发送到两个地方,可使用tee命令。tee命令的作用是从标准输入读取数据,并向标准输出和一个文件各发送一条数据。tee命令的语法为

tee [-a] file…

-a ( append, 追加)可以在文件末尾添加数据,而不是替换文件。

 

10)条件执行

有时候,希望在前一条命令成功执行的条件下执行另一个命令,语法为 command1 && command2

有时候,希望在前一条命令没有成功执行时执行另一条命令,语法为 command1 || command2

 

 

阅读(1049) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~