Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135173
  • 博文数量: 28
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 17:05
个人简介

运维开发工程师。致力于网络,WEB应用服务,Linux系统运维。方向:操作系统,监控,自动化

文章分类

全部博文(28)

文章存档

2013年(12)

2012年(16)

分类: Python/Ruby

2012-12-08 17:13:40

Intro
关于IO重定向的基础知识和常见用法。


标准I/O
基本概念
标准输入/输出(standard I/O),是unix软件设计最重要的概念之一。程序应该有数据的来源端(标准输入standard input,文件描述符为0),结果数据的目的端(标准输出standard output,文件描述符为1),以及运行有问题时报告错误的地方(标准错误输出standard error,文件描述符为2)。

程序无关性
程序不必了解输入和输出背后的目的是什么设备,可能是文件,用户交互输入的命令,磁带,网络连接甚至是另一个进程。当程序被启动时,可以预期的是,系统已经准备好了标准输入、输出提供程序使用。

程序如何使用标准IO
默认情况下,程序会读取标准输入,写入标准输出,并将错误信息写入标准错误输出。默认情况下,这三个标准IO都被安排(连接)到终端。


IO重定向
IO重定向,就是改变默认I/O的来源端和目的端,也可以说"改变标准输入、输出后连接的设备"。

以<改变标准输入
  1. program < file        #使program从file读取输入内容,标准输入被重定向到file。
  2. --------------------------------------
  3. tr -d 'i' < plain.txt
以>改变标准输出
在>或>>前加上文件描述符可指定具体哪个输出被重定向
  1. program > file         #使program的输出写入文件file,标准输出被重定向到file,trunc模式
  2. program 1> file #等价于
  3. ---------------------------------------------
  4. tr -d 'i' < plain.txt > output.txt #删除plain.txt里的i字符,并输出到output.txt里
  5. ---------------------------------------------
  6. program >> file #使program的输出写入文件file,标准输出被重定向到file,append模式
  7. ---------------------------------------------
  8. for i in log.20121208.* #汇总ERROR日志
  9. do
  10.     grep ERROR $i >> log.20121208.err
  11. done
  12. ---------------------------------------------
  13. program 1> log 2> log.err #分别重定向
  14. ---------------------------------------------
  15. program 1> log 2>&1 #将错误输出重定向到标准输出,合并输出到一处
  16. program 1> log 2>log #等价形式
  17. program 1>> log 2>&1 #追加模式
注意:
">file"在file存在时,先清空file,再写入文件,因此具备覆盖性;在文件不存在时,创建之
">>file"会以追加的行为把输出附加到文件末尾。

建立管道
使program1的标准输出为program2的标准输入,即program1的标准输出被重定向到program2的标准输入。这样做的好处可以灵活拼装各种专用unix工具,形成数据的过滤器。
  1. program1 | program2    #即program1的标准输出被重定向到program2的标准输入
  2. --------------------------------------
  3. tr -d 'i' < plain.txt | sort | grep 'be'


/dev/null和/dev/tty设备
数据黑洞:/dev/null
传送到/dev/null的数据都会被系统丢弃,当程序写入/dev/null时,会认为已结束写入操作。
  1. some_command 2> /dev/null #屏蔽错误输出
终端设备:/dev/tty,可以用来实现密码读取的功能
  1. echo -n "Enter the password : "
  2. stty -echo #关闭自动打印输入字符的功能
  3. read pswd < /dev/tty
  4. stty echo #开启自动打印输入字符的功能
  5. echo #换行
  6. echo $pswd


附:plain.txt内容


  1. #plain.txt
  2. send someone to love me
  3. i need to rest in arms
  4. keep me safe from harm
  5. in pouring rain
  6. give me endless summer
  7. lord i fear the cold
  8. feel i''''m getting old
  9. before my time
  10. as my soul heals the shame
  11. i will grow through this pain
  12. lord i''''m doing all i can
  13. to be a better man

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