文档章节

Linux标准输入输出及文件描述符

Caishu
 Caishu
发布于 2016/05/16 22:36
字数 1540
阅读 775
收藏 10

1.标准文件描述符0,1,2

1.1  STDIN标准输入

对终端界面来说,标准输入时键盘;也可以使用重定向符号<,用重定向指定的文件来代替标准输入文件描述符。

#键盘输入
$cat           
This is the first time enter word
This is the first time enter word
This is the second time enter word
This is the second time enter word
#文件输入
$cat < filename
first line
second line

1.2  STDOUT标准输出

在终端界面上,标准输出就是显示器。也可以使用重定向符号>file,将内容输出到文件中;>>file  追加到file文件

1.3  STDERR标准错误

默认情况下,标准错误也显示到显示器上。但STDERR不会自动重定向,因此需要设置2>file将错误信息输出到file中。

注:可以用 2> file1 1>file2分别将标准错误和标准输出重定向到不同的文件中

也可以用 &>file 将标准错误和标准输出重定向到同一文件中,但bash shell会给标准错误分配更高的优先级,先输出标准错误

2.在脚本中重定向输出输入

2.1临时重定向

在脚本中重定向到文件描述符时,必须在文件描述符数字之前加&

#!/bin/bash
echo "this is an error" >&2
echo "this is normal output"

执行结果
$./shell1.sh           默认情况下Linux会将STDERR定向到STDOUT
this is an error
this is normal output

$./shell.sh 2>shellerr      将错误重定向才可以
this is normal output
$cat shellerr
this is an error

2.2永久重定向 exec

exec命令告诉shell在脚本执行期间重定向某个特定文件描述符:exec 1>testout  将标准输出重定向到testout文件。但对于标准错误,在文件中重定向时也还要指定,如:

#!/bin/bash
exec 2>testerror
echo "this is the start"
exec 1>testout
echo "this is normal out"
echo "this is error" >&2     #注:尽管被STDOUT重定向了,仍然可以将指定输出发给STDERR

执行结果:
$./shell2.sh
this is the start
$cat testout
this is normal out
$cat testerror
this is error

2.3 重定向输入exec 0< file

这个 重定向只要在脚本需要输入时,就会作用

$cat testfile
this is the first line
this is the second line
this is the third line
$cat shell3.sh
#!/bin/bash
exec 0<testfile

while read line
do
  echo "Line: $line"
done
$./shell3.sh
Line: this is the first line
Line: this is the second line
Line: this is the third line

3.创建自己的重定向3~8

3.1创建输出文件描述符

exec 3>file     exec 3>>file  追加方式重定向。与标准1,2类似

3.2重定向文件描述符

exec 3>&1
exec 1>testout
commond   #重定向到testout文件
exec 1>&3

exec 3>&1 将3重定向到1的位置,也就是STDOUT,表示3的输出都讲显示在屏幕上                 exec 1> testout  将标准输出重定向到testout文件                                                                    exec 1>&3          将标准输出重定向到屏幕

输入与输出类似

exec 6<&0
exec 0<testfile
commond   #重定向到testout文件
exec 0>&6

3.3创建读写文件描述符

exec <>file  命令

当脚本向文件写入数据时,它会从文件指针处的位置开始。会将数据放在指针的当前位置,覆盖该位置的原来的数据

#!/bin/bash
exec 3<>testfile

read line <&3
echo “Read: $line"
echo "this is error"
执行结果
$cat testfile
this is the first line
this is the second line
this is the third line

$./shell4.sh
Read: this is the first line

$cat testfile
this is the first line
this is error
this is the third line

3.4关闭文件描述符  

exec 3>&-   改语句会关闭文件描述符3,从而阻止在脚本中使用它,若开始exec 3>file ,一旦关闭就不可以再向file写数据,否则报错。注:若在后面脚本中再次启用exec 3>file,与file相同文件,则shell会用新文件代替已有文件。

4.列出打开的文件描述符 lsof

lsof命令会列出整个linux系统打开的所有文件描述符,选项-p,-d,-a常用来过滤输出               -p 指定进程ID(-p $$ 显示当前进程ID);-d 指定要显示的文件描述符。

5.阻止命令输出null

/dev/null  Linux系统上null文件的标准位置,重定向到改文件的任何数据都会被丢掉。不会显示。可以将 STDERR重定向到这个文件

cat  /dev/null  > logfile   清除日志的通用方法,不删除文件,只将文件内容清空。

6.创建临时文件

Linux使用/tmp目录来存放不需要一直保留的文件,大多数Linux配置了,在启动时,自动删除/tmp目录的所有文件。mktemp创建临时文件,不用默认的umask的值,属主有读写权。

创建临时文件和目录mktemp

使用模板可以创建不同名字的多个文件,在文件末尾加上6个XXXXXX就可以了。mktemp命令会用6个字符码替换6个X,从而保证目录名在文件中是唯一的。

caishu@lab403-1F:~$ mktemp test.XXXXXX
test.h47XzR
caishu@lab403-1F:~$ mktemp test.XXXXXX
test.wLBSRM
caishu@lab403-1F:~$ mktemp test.XXXXXX
test.gjtA5O
caishu@lab403-1F:~$ ls -al test*
-rw------- 1 caishu caishu    0  5月 16 22:39 test.gjtA5O
-rw------- 1 caishu caishu    0  5月 16 22:39 test.h47XzR
-rw------- 1 caishu caishu    0  5月 16 22:39 test.wLBSRM

mktemp -t 命令在/tmp目录创建文件,返回的文件带有全路径,可以在linux系统上任何目录下引用该临时文件。

mktemp -d  创建临时目录     也可以用模板 mktemp -d dir.XXXXXX

7.记录消息

用tee命令可以一边发送到显示器一边发送到文件

$date | tee file1
mondey may 16 23:03
$cat file1
mondey may 16 23:03

可以用tee -a file追加到文件

© 著作权归作者所有

Caishu
粉丝 2
博文 32
码字总数 28183
作品 0
广州
程序员
私信 提问
linux shell数据重定向(输入重定向与输出重定向)详细分析

导读小文:【http://www.ibm.com/developerworks/cn/linux/l-iotips/】 技巧:Linux I/O重定向的一些小技巧 简介: Linux I/O 重定向虽然很简单,但在脚本编写、系统管理时却要常常打交道,搞...

无明时空
2013/03/06
0
0
Linux技术学习:Io重定向 Redirection 详解

文件描述符在bash中比较少用,从0开始用户表示进行的数据流,0表示标准输入,1表示标准输出,2表示标注错误输出,其他从3开始。最为常用的场景是将错误消息输出到某个文件,可以加上2>file到...

长沙千锋
2018/05/03
0
0
Linux下几种反弹Shell方法的总结与理解

  *本文原创作者:LlawLiet,本文属FreeBuf原创奖励计划,未经许可禁止转载。   之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力...

FreeBuf
2018/07/27
0
0
linux 重定向

Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。 Li...

长平狐
2012/09/19
341
0
linux shell 编程 12 重定向

输出/输入重导向 > >> < << :> &> 2&> 2<>>& >&2 文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。 常用的文件描述符如下: 文件描述符 名称 常用缩写 默认值 0 标准输......

QH_C
2015/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
17
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部