标准输入、输出、错误

文件描述符

每个进程会默认打开3个文件描述符:

STDIN_FILENO:值为0,代表标准输出流

STDOUT_FILENO:值为1,代表标准输入流

STDERR_FILENO:值为2,代表标准错误流

设备文件

标准输入文件:stdin,是指向键盘缓冲区的文件指针

标准输出文件:stdout,是指向屏幕显示区的文件指针

标准错误文件:stderr,是指向屏幕显示区的文件指针

  通过这两个指针封装了键盘和屏幕I/O操作的底层实现细节,从标准输入读取就是读取 /dev/stdin 的文件内容,输出到标准输出就是写入 /dev/stdout 文件。但实际上 /dev/stdin 和 /dev/stdout 并不是真实的文件,而是链接文件,它们连接到其他文件(默认是键盘缓冲区文件和屏幕缓冲区文件)。

  可以看见stdout和stderr都是指向屏幕,那为什么还要分成stdout 和 stderr 呢?这是因为通常在 server 的工作环境下,几乎所有的程序都是 run 在 background 的,所以为了方便 debug,一般在设计程序时,就把stdout 送到/存到一个档案(即重定向),把错误的信息 stderr 存到不同的档案。

重定向

  C库提供的一些标准I/O函数操作的是文件描述符,即标准输入流、输出流、错误流,而不是键盘的设备文件或屏幕的设备文件。通常标准输入流对应着键盘的标准文件,标准输出流和错误流对应屏幕的标准文件,但是当使用重定向后改变标准输入、输出、错误流对应的文件后,这些标准I/O函数读取的输入或输出的对象就不再是键盘或屏幕,而是重定向的文件。

Linux中的重定向符是 <>,例如:

  test.sh > test.log 指令会把test.sh脚本的标准输出重定向到文件test.log,也就是原本打印到终端的输出内容被打印到test.log文件中。但是,如果 test.sh 脚本中有语法错误或者其他,那么错误信息作为标准错位仍然会被打印到终端中。

  想要把错误信息和标准输出一起打印到 test.log 文件的话,需要使用 test.sh > test.log 2>&1 ,其中 2>&1 是把这个进程中的标准错误重定向到标准输出,然后就能和标准输出一起被打印到test.log文件中。

  注意,2>&12>1不一样,后者是把标准错误重定向到名为 1 的文件,而不是标准输出。

command > file 2>file 与 command > file 2>&1 的区别

  直观上二者的作用都是把标准错误和标准输出都重定向到文件 file 中,但是实际作用有所区别。前者是把stder和stdout分别送到file中,file相当于被打开两次,这样stderr和stdout的内容会互相覆盖,相当于使用FD1和FD2两个同时抢占file的管道。而后者是将stderr和stdout以同一个管道送往file,file只被打开一次。并且后者效率更高。

重定向到 /dev/null

  /dev/null是一个无底洞,输入到其中的内容会直接消失,并且它是个只读文件。通常有不想要的垃圾信息可以扔进 /dev/null。

  >/dev/null 2>&1 的作用是把标准错误和标准错误都重定向到 /dev/null 中,没有文件描述符时默认是 1,即标准错误重定向到标准输出,而标准输出重定向到了 /dev/null,所以脚本执行时不输出任何信息到终端。

  cat /dev/null > file 的作用是清除文件 file 的内容。

标准输入/出与重定向相关推荐

  1. 分享:Linux标准输入/输出和重定向

    1. 标准输入与输出 我们知道,执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘:标准输出文件(stdout)和标准错误输出文件(stderr), ...

  2. 标准输入/输出和重定向

    1. 标准输入与输出 我们知道,执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘:标准输出文件(stdout)和 标准错误输出文件(stderr) ...

  3. linux 输出重定向_linux学习笔记(实验楼) 实验12 数据流重定向

    一.实验介绍 1.1 实验内容 你可能对重定向这个概念感到些许陌生,但你应该在前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是 ...

  4. linux io重定向指令,Linux基础知识之 IO重定向

    通常在 Shell 中执行命令的时候,我们会在输入命令的下方看到执行结果,操作系统默认将命令的执行结果输出到显示器上.当然,我们也可以手动的指定输出路径,或者输入路径,这就是 I/O 重定向. 1.标 ...

  5. linux中重定向学习总结

    文件标识符是从0到9结束的整数,指明了与进程有关的特定数据流源.当Linux系统启动一个进程(该进程可能用于执行Shell命令)时,将自动为该进程打开三个文件:标准输入.标准输出和标准错误输出,分别由 ...

  6. 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向

    本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处: linux下的文件描述符是与文件输入.输出相关联 ...

  7. 玩转Linux文件描述符和重定向

    本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...

  8. Linux入门之inode解析及管道重定向

    Linux入门之inode解析及管道重定向 inode 简介: 当磁盘分区格式化后会根据分区格式.大小等信息来指定分区分配多少个inode表,每个inode表都会有一个在当前分区中唯一的编号,可能有一 ...

  9. 解释linux中的三种重定向,Linux重定向及反弹shell详解

    这里说Linux重定向的原因主要还是为了详细了解一下Linux中的反弹shell 目录 0x01 文件描述符 0x02 重定向 0x03 反弹shell 0x04 交互重定向 0x05 命令变形 0x ...

最新文章

  1. 黄聪:IE6下用控制图片最大显示尺寸
  2. 知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践
  3. Linux命令之du
  4. 【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )
  5. ESIM (Enhanced LSTM for Natural Language Inference)
  6. 【Python】中小括号()、中括号[]、花括号{}的区别详解
  7. InfluxDB中文文档
  8. 巧妙喝水打败多种疾病
  9. DataSetProvider的Option属性
  10. SQL Server 中的例程分析
  11. 细胞自动机,那是什么?
  12. 用cmd命令行下载github中的工程文件
  13. 一文详解自动驾驶技术与挑战
  14. 文本情感分类python_文本情感分类(一):传统模型
  15. 终端安全防护技术研究(四)
  16. 物联网操作系统Zephyr(入门篇)之1.0 Zephyr简介
  17. 看他如何做到4年2个博士学位,做研究、出书挣钱两不误。
  18. HERO2009 午夜骚魂
  19. ReclyclerView刷新数据
  20. 9.22 英语单词回顾

热门文章

  1. JavaScript 禁用键盘按钮
  2. [转]ASP.NET中常用的文件上传下载方法
  3. 采购部管理--餐饮原料的验收管理
  4. Java虚拟机字节码指令概述
  5. Wireshark EndPoints窗口
  6. C# 以日期时间作为文件名学习总结
  7. NotePad++学习总结
  8. 译:Spring Boot 自动伸缩
  9. [2-SAT]【学习笔记】【未完】
  10. How Tomcat Works(八)