1. 什么是标准文件
shell为每个命令打开三个文件(流),用于
读取输入——标准输入——键盘
输出结果——标准输出——显示屏(控制台)
输出错误消息——标准错误——显示屏(控制台)
当shell发现命令行中存在特殊字符(<,>,|)时,shell就把流从它的默认设备上断开,连接到磁盘文件或另一个命令。
2. 标准输入重定向
当命令后不带 任何参数时,它从标准输入文件中读取数据。该文件可以代表三个输入源:
键盘,默认输入源
文件,要用 < 重定向符
其他命令,要用 |(管道符)
例子:wc不带参数时,也没有和< 或|特殊字符连接时,wc就从默认设备(键盘)获取输入
#wc
hello, how are you?
I’m fine.
[ctrl+d]
语法
command < input file
语义
如果command从标准输入读取输入,则该输入来自于input file,而不是键盘
例
#wc < tmp: shell扫描到< 符号时,就打开tmp文件, 然后shell断开标准输入的默认源,把它连接到tmp文件,cat命令从标准输入读取数据,标准输入已经由shell重定向到 tmp文件
#wc tmp:wc命令打开tmp文件,读取数据显示到屏幕上。
3.标准输出重定向
类似输入重定向,结果输出到屏幕上的命令,实质是把结果以字符流的形式输出到标准输出文件里,而不是直接输出到终端上。输出流有三个目标对象:
终端,默认目标
文件,用> 或 >> 重定向
来自于另一个命令的输入,用管道符|
说明:>> 是在文件末尾添加
语法: command > output file
语义:将命令command的输出发送到文件output file,而不是屏幕
例
#date
#date > apple //当shell扫描到>符号时,创建一个新文件apple为写入做准备;然后shell断开标准输出文件的默认目标设备,并连接到apple文件;date把结果写入到已 重定向到apple文件的标准输出。
!不要覆盖文件:重定向输出到一个文件时要小心,确信文件名不存在,否则将被覆盖!
三个标准文件都对应一个称为文件描述符的数字代码。当文件打开进行读写操作则需要用到文件描述符。标准文件描述符:
0:标准输入
1:标准输出
2:标准错误
重定向与文件描述符使用可以显式说明重定向
<等价于0<
>等价于1>,表示输出重定向
如:cat aa 1> bb 与 cat aa >bb 一样的意思
2>,显式指定错误重定向
4.错误重定向
command 2> error-file
命令的错误信息与普通返回区分
标准错误重定向将错误信息单独输出
例
#cat foo
cat:foo:no such file or directory
#cat foo > error
cat:foo:no such file or directory //可见,错误信息并没有保存到error文件
#cat foo 2>error
#cat error
例:从文件input得到标准输入,并发送输出到result文件,可以使用下列任意命令:
#cat > result < input
#cat < input > result
#cat>result<input
#> result < input cat
输入源和输出目标在一个命令行中的次序和位置并不重要,以及他们前后的空格个数并没有严格限制。这正是UNIX系统最强大的功能之一。