首页 > linux > 标准的文件输入、输出(>> &> 1> 2> )

标准的文件输入、输出(>> &> 1> 2> )

作者:bin
目录
[隐藏]

速解

速解:将>>拆解为3个参数

  1. 文件描述符表示标准与错误流
  2. 第一个>表示输出流
  3. 第二个>表示追加
  4. > 与 >  与 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命令中

 

 

您必须 [ 登录 ] 才能发表留言!