一、输入和输出
1、标准文件描述符
每个进程中最多可以有9个打开文件的描述符:0——stdin,1——stdout,2——stderr。
(1)STDIN
对于终端,stdin就是键盘。
使用输入重定向符号(<)时,就将使用重定向引用的文件替换标准的输入文件描述符。
(2)STDOUT
对于终端,stdout就是显示器。
使用输出重定向符号(>)时,就将使用重定向引用的文件替换标准的输出文件描述符。
还可以使用>>,向文件追加数据。
(3)STDERR
shell将错误提示信息与正常输出信息分开处理。默认情况下,stderr与stdout都是输出到显示器。
2、重定向错误
有几种方法可以进行重定向数据
(1)仅重定向错误: 2> file (2必须位于>的正前方,2与>之间不能有空格),此时标准输出不受影响,仍然输出到显示器
(2)重定向错误和数据:
同时使用两个重定向输出到不同文件,2> file1, 1> file2。
输出到同一个文件:&> file
二、在脚本中重定向输出
使用脚本重定向输出的方法有以下两种
1、临时重定向
重定向到某个文件描述符,必须在编号前加&号。ex: >&2 (>& 间无空格)
然后当这个文件描述符对应的文件被重定向后,脚本对应的重定向输出内容也同样被重定向。
2、永久重定向
可以使用exec命令通知shell在脚本执行期重定向特定的文件描述符
ex: exec 1>testout
重定向stdout和stderr后,就无法轻松再重定向回原来文字,需要使用技巧(见下方)
三、在脚本中重定向输入
同样使用exec即可,ex: exec 0< file
对于读取文本数据并使用脚本处理,这是一个好方法。
四、创建自己的重定向
除了0,1,2外,其他3-8都可以用于创建自己的重定向。
1、创建输出文件描述符
同样是先使用 exec 3>test13out,再将某一行 ……… >&3
2、重定向文件描述符
可以将stdout等的原位置重定向到备选文件描述符,然后将该文件描述符重定向回stdout。
ex: exec 3>&1
exec 1>file
……
exec 1>&3
这是一种临时重定向脚本文件输出然后恢复回普通设置的常用方法
3、创建输入文件描述符
使用上方同样的方法,可将stdin先保存,再定向,再恢复
ex: exec 6<&0
exec 0< testfile
…………
exec 0<&6
4、创建读取/写入文件描述符
可以使用同一个文件描述符从一个文件读取数据,同时向这个文件写入数据: exec 3<> testfile
内部将维护一个文件指针,指示内部的位置,读取和输入都将发生在指针上次所指的位置
5、关闭文件描述符
使用&-进行关闭文件描述符,ex : exec 3>&- (之后就不可以再使用3了)
如果再开同一文件,将覆盖之前数据
五、列出开放文件描述符
使用lsof命令可以列出整个系统上开放的文件描述符。
可以使用$$确定当前PID,ex: lsof -a -p $$ -d 0,1,2
六、禁止命令输出
将stderr重定向到空文件(/dev/null),则输出的任何数据都不会保存,即全部丢失。
使用 cat /dev/null > testfile 就可以快速将testfile中所有数据全部抹除。
七、使用临时文件
/tmp目录专门用于保存临时文件,每次开机时,/tmp下的文件都将自动删除。
可以使用mktemp命令,在/tmp下创建一个唯一的临时文件
1、创建本地临时文件
mktemp 文件名.xxxxxx 就可以在本地目录创建一个唯一的文件
在脚本中使用mktemp命令,需要使用一个变量保存该文件名。
2、在/temp中创建临时文件
使用mktemp -t就可以在/temp下创建临时文件,返回的是完整路径名
3、创建临时目录
使用mktemp -d就可以在当前目录下创建临时目录
八、记录消息
同时将消息发送到监视器和文件,就可以使用tee命令。
ex: tee filename 将stdin的数据同时发送到stdout,和指定的文件filename
可以与管道命令配置使用重定向任何命令的输出:ex: date | tee testfile
默认情况下,每次使用tee都将覆盖输出文件,使用-a就可以向文件添加数据