WordPress极简博客 WordPress极简博客
  • 新鲜事
  • 战疫情
  • UI素材
    • UI素材
    • 电商/节日
    • PPT
      • 节日庆典
      • 工作汇报
      • 商业计划书
    • word
      • 简历竞聘
      • 合同/公文
  • 创客头条
    • 音乐分享
    • 初创文章
    • 极客头条
    • 生活趣事
    • 生活日记
    • 防骗指南
  • 编程教学
    • API日记
    • Linux安全栏目
      • Linux运维安全汇总
      • DDOS攻击防护
      • XSS攻击防护
      • SQL安全防护
    • Python技术栏目
      • Python基础入门
      • Python基础结构
    • WordPress技术栏目
      • WP主题
      • WordPress技术教程
      • RIPRO主题美化
    • WordPress漏洞发布
    • 技术教程汇总
    • 严选源码
  • 专题
  • 基友
  • 隐私
  • 注册
    登录
立即登录
  • 首页
  • 云优化
  • 新疫情
  • 新鲜事
    • 热文
    • 极客
    • 生活
  • 技术篇
    • WP主题
    • 技术教程
    • Python入门
    • Python基础
  • 专题篇
  • 友链君
首页 Linux安全 Linux文件描述符和IO重定向

Linux文件描述符和IO重定向

夏柔 7月 24, 2020

一、文件描述符

在linux和unix系统中,一切都是文件,内核是通过文件描述符来访问文件,文件描述符是非负整数,最大值受系统最大可打开的文件数限制。可以使用命令查看:

ulimit -a

查看open files的值,默认是1024。

二、标准流
先来看看维基百科中标准流的定义: 在linux和unix系统中,一个程序运行时和环境交互(INPUT/OUTPUT)的通道,叫标准流。

对于Linux下的进程,每个进程都有三个标准的文件描述符,对应于三个标准流:

  1. 标准输入:文件描述符为 0,对应标准流 stdin ,对应设备为键盘
  2. 标准输出:文件描述符为 1,对应标准流 stdout,对应设备为显示器
  3. 标准错误:文件描述符为 2,对应标准流 stderr,对应设备为显示器

linux下的用户都是通过终端进行交互,如bash、sh、zsh等,从键盘接收输入,在显示器上打印输出

三、linux I/O重定向分类

Linux重定向操作发生在三个标准流之间,主要来完成复杂的任务,允许你控制程序或命令的输入输出流。
主要分为:

  1. 输入重定向 <
  2. 输入重定向读写模式 <> ,以读写模式重定向到输入,没有则创建文件
  3. 输出重定向 >
  4. 输出重定向追加模式 >>
  5. 非标准重定向 &> ,将标准输出和标准错误重定向
  6. 非标准重定向追加模式 &>>
  7. 管道 | ,将一个命令的输出做为另外一个命令的输入

四、举例

1.正常执行命令,将标准输出和标准错误都显示在终端上,我相信能看到我这篇文章的人都会

./command

2.将标准输出重定向到文件

./command 1> stdout.log 

1在终端中可以省略,就变成了最常见的情况:

./command > stdout.log

此时如果重新执行有错误,标准错误会显示在终端上

3.将标准错误重定向到文件

./command 2> stderr.log

此时标准输出会正常打印到终端上

4.执行命令,将输出日志打印到stdout.log,将错误日志打印到stderr.log

./command 1>stdout.log 2>stderr.log

此时终端什么都不显示

5.执行命令,将标准输出和标准错误都重定向到同一个文件

./command &> all.log

或者用麻烦一点的方法:

./command > all.log 2>&1

6.执行命令,即重定向标准输出又同时在终端打印,需要借助管道符和命令tee

./command |tee  stdout.log

将标准输出和标准错误全部重定向,并输出到终端

./command 2>&1 |tee all.log

还记得上面说的管道的定义吧,这个实际上是执行两个命令,./command 2>&1 将全部日志重定向到标准输出,在作为标准输入传给tee命令

7.执行命令,打印标准输出,重定向标准输出和标准错误

./command 2>stderr.log |tee stdout.log

8.丢弃输出,/dev/null是系统的垃圾箱,可以将标准输出、标准错误全部输出到这个设备

./command >/dev/null
./command 2>/dev/null
./command &> /dev/null

有了上面的说明,我相信这三条命令不用解解释了

9.利用输出重定向创建文件

> newfile.txt

这个命令等同于:

: > newfile.txt

:是一个占位符, 不产生任何输出,这种情况可以用来创建空文件

10.输入重定向

cat 0<  /etc/issue

0也可以省略不写

cat <  /etc/issue

11.输入重定向到交互的shell

cat << EOF
Hi nixops.me
EOF

此时是以EOF为分隔符,可以输入任意内容,直到再次输入EOF完成,输入的内容会做为cat命令的输入显示,此例中输出Hi nixops.me

五、高级用法
上面讲到的例子只是在标准输入(0)、标准输出(1)和标准错误(2)之间进行IO重定向,开头也说了,文件描述符是非负整数,最大值受系统的ulimit里open files限制,除标准文件描述符外,那有没有办法在普通文件描述符之间重定向呢?
我们先来看一个刚刚举过的例子:

./command > all.log 2>&1

这个例子的意思是,将标准错误(2)重定向(>)到标准输出(1),并将所有标准输出重定向到all.log,那如果是普通的文件描述符,是否可以这样重定向呢?

答案是可以的。

例如,我有一个文件描述i和j,两个文件描述符之间进行重定向 i>&j,含义是:

  1. 重定向文件描述符i到j
  2. 指向i文件的所有输出都发送到j

同理,也可以将标准文件描述符,重定向到普通文件描述符,如 >&i,含义是:将标准输出重定向到文件描述符i。

下面我们来举例说明,我们先来创建一个文件描述符,可以用exec命令,以读写模式创建一个文件描述符:

exec 3<>newfile

然后向文件描述符3写入内容:

echo 'nixops.me' >&3

需要关闭文件描述符3,使用命令:

exec 3>&-

关闭后就生成了newfile文件,查看一下内容:

cat newfile
nixops.me

经过上面的例子,下面这些也很好理解,简单说明一下:

  1. >&- 等同于 1>&- 关闭标准输出
  2. <&- 等同于 0<&- 关闭标准输入
  3. >&i 等同于 1>&i 将标准输出重定向到文件描述符i
  4. <&i 等同于 0<&i 将文件描述符i重定向到标准输入
  5. i<&- 关闭文件描述符i的输入
  6. i>&- 关闭文件描述符i的输出
  7. i>&j- 将文件描述符j的输出文件移动到i上,并关闭j
  8. i<&j- 将文件描述符j的输入文件移动到i上,并关闭j
  9. 创建文件描述符时名称可以用变量

附:
askubuntu.com里有个答案下,有人做了一个表格,直观的看出在使用重定向的情况下,stdout、stderr在终端是否显示、是否重定向到文件、文件是否会创建。这几种情况一目了然,帮助理解。

终端显示文件内容文件状态
语法StdOutStdErrStdOutStdErrFile
command >否是是否创建
command >>否是是否追加
command 2>是否否是创建
command 2>>是否否是追加
command &>否否是是创建
command &>>否否是是追加
command | tee是是是否创建
command | tee -a是是是否追加
command |& tee是是是是创建
command |& tee -a是是是是追加

参考文章:
https://en.wikipedia.org/wiki/Standard_streams
https://askubuntu.com/questions/420981/how-do-i-save-terminal-output-to-a-file/731237#731237
https://www.putorius.net/linux-io-file-descriptors-and-redirection.html
https://www.junmajinlong.com/shell/fd_duplicate/

#INPUT#linux#OUTPUT#标准流
0
J2dcg1.png
猜你喜欢
  • 【高危】fastcdn用户数据库表存在明文,修改用户数据无鉴权限制即可增删改
  • fastcdn删除节点数据缺乏身份验证机制
  • fastcdn之SSH列表数据接口
  • fastcdn系统昨日上线发现两个未经身份验证接口
  • 关于宝塔新面板(真实性为止)
  • Nginx添加跨域限制规则
  • 使用测速脚本对国内Linux服务器进行测速
  • 手机号-社交媒体-地理位置开源情报
  • 域名爆破之自动化信息收集脚本
  • 利用免费接口实现国家开放大学刷网课脚本
15 5月, 2020
浪漫520告白气球简约清新促销海报
夏柔
站长
夏山如碧 - 怀柔天下
1724
文章
25
评论
58145K
获赞
版权声明

文章采用创作共用版权 CC BY-NC-ND/2.5/CN 许可协议,与本站观点无关。

如果您认为本文侵犯了您的版权信息,请与我们联系修正或删除。
投诉邮箱wpsite@aliyun.com

栏目推荐
Python基础入门33
WordPress技术教程267
前沿技术情报所22
城市创新——新消费11
最近有哪些不可错过的热文23
程序员的养生之道0
节
春
  • 新鲜事
  • 疫情实况
  • UI素材
  • 技术教程
  • 音乐分享
  • 专题
  • 友情
  • 隐私
  • 云优化
Copyright © 2019-2025 WordPress极简博客. Designed by 夏柔. 辽公网安备21010502000474号 辽ICP备19017037号-2