标准的文件输入、输出(>> &> 1> 2> )
作者:bin速解
速解:将>>拆解为3个参数
- 文件描述符表示标准与错误流
- 第一个>表示输出流
- 第二个>表示追加
- > 与 > 与 1> 的区别 :1>等价于> 或者 1>>等价于>>,等价于 1>file 2>file 即标准与错误都输出至file。
一、输入流
0:标准输入流
cat < testfile
二、输出流
1:标准输出流
2:错误输出流
ls -l > testfile 将内容覆盖 ls -l >> testfile 将内容附加 ls -l 1> testfile 标准输出流 ls -l 2> testfile 重定向错误 ls -l 2> errfile 1> testfile 分别重定向 ls -l > testfile 重定向错误和数据 echo "this is err" >2 使用描述符2表示这条输出为STDERR输出(这里要在描述符前使用) exec 1>testfile 将该命令后的所有内容重定向至testfile(避免每个语句都进行重定向同理 exec 2>testfile 和exec >testfile) exec 0
三、创建文件描述符
(和变量类似,赋值时直接写名字,使用时带上)
下面演示输出由显示屏=>文件=>显示屏的方法 exec 3>1 定义描述符3指向(显示屏) exec 1>testout 将标准输出,重定向至文件 exec 1>3 将标准输出,重定向至描述符3(显示屏) 下面演示输入由控制台(read)=>文件=>控制台(read) exec 6<0 将描述符6,重定向至标准输入(控制台read) exec 0 exec 0<6 将描述符0,重定向至标准输入(控制台read)
创建读写文件描述符
exec 3<>testfile echo "hello" >3 将输出指向文件 read line <3 读取文件输入流
关闭文件描述符(如果重复关闭打开同一个文件,后者会覆盖前者的文件内容)
exec 3>-
列出打开的文件描述符
lsof -a -p $$ -d 0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 31897 ben 0u CHR 136,1 0t0 4 /dev/pts/1 bash 31897 ben 1u CHR 136,1 0t0 4 /dev/pts/1 bash 31897 ben 2u CHR 136,1 0t0 4 /dev/pts/1
DEVICE就是终端设备名称
四、创建临时文件
下面的脚本演示了如何使用一个临时文件(mktemp -t将会在/tmp/目录下创建, -d 就会创建一个目录,并返回完整路径)
#!/bin/bash tempfile=$(mktemp t.XXXXXX) 创建临时文件 exec 3>$tempfile 将描述符指向临时文件 echo "呵呵" >3 输出内容至临时文件 exec 3>- 关闭输出流 cat $tempfile 打印临时文件内容 rm -f $tempfile 2> /dev/null 删除临时文件(将错误输出流指向null)
五、T型输出流(tee)
应用场景:由于日志文件过长,或者记录速度过快,我们使用vim打开会很慢,而使用tail -f t.log查看又会闪的太快。
tee解释:
命令相当于管道的T型头,将STDOUT的输出数据同时发往2处,一处是STDOUT,另一处是tee 命令指向的文件.
tail -f t.log | tee -a tmp.log
将输出流的内容同时也打印在tmp.log中,这里-a表示追加内容.
六、实例
命令:./test.sh user.csv
脚本:
#!/bin/bash outfile='test.sql' <span style="text-decoration: underline;"><strong><a href="http://zengbingo.com/p/407.html" target="_blank" rel="noopener noreferrer">IFS</a></strong></span>=',' while read id name do cat >> $outfile << EOF your name is $name your is $id; EOF done < ${1}
user.csv文件内容:
$cat user.csv rich,Richard Blum tim,Timothy Bresnahan
脚本中出现了3处使用文件重定向操作,
1、while 的done处,将输入的文件名称作为while的输入流
2、cat >> $outfile将cat 命令的输出内容指向$outfile
3、$outfile << EOF ....EOF 将内容EOF中的内容输入至cat >> $outfile命令中