理解 Linux shell 中的一个方言:2>&1

 2016-11-14 杜亦舒

前言

在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1

如果是刚开始接触Linux,这个东西的确不好理解,因为他没有直观的含义,不像一个命令,例如 cp是 copy 的简写,很好记。

我以前刚用Linux时就对这个东西迷糊了一段时间,今天刚好看到一篇文章介绍他,感觉很有必要总结出来,分享给还不是很理解这个方言的朋友。

下面看一个命令示例,然后分析下他是如何工作的:

ls foo > /dev/null 2>&1

首先需要了解两个基础概念:I/O重定向、文件描述符

I/O重定向

重定向 的作用是把一个命令的输出结果发送到另一个地方。

例如,使用 cat 命令查看一个文件,文件内容会被打印到屏幕 :

$ cat foo.txt
foo
bar
baz

此时,屏幕就是命令的标准输出( standard output 【stdout】)位置。

我们可以把文件内容发送到别的地方,例如,重定向到 output.txt 文件中 :

$ cat foo.txt > output.txt

$ cat output.txt
foo
bar
baz

其中第一个 cat 使用 >把 stdout 的位置改为了另一个文件。

再看一个例子,查看一个不存在的文件:

$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory

这里的错误提示信息为什么显示到了屏幕,而不是发送到 output.txt 呢?

这就涉及到了另一个位置:标准错误输出standard error 【stderr】。

$ cat nop.txt > output.txt

这个命令是把 stdout 定位到了文件,而没有定义 stderr 的位置,所以错误信息显示到了默认的位置:屏幕。

文件描述符

Linux 中一切皆文件,每个文件都有一个文件描述符,值是个正整数。

所以,标准输出stdout与 标准错误输出stderr也有自己的文件描述符:

  • stdout 为 1

  • stderr 为 2

综合

$ cat foo.txt > output.txt

实际上就是这样的:

$ cat foo.txt 1> output.txt

就是把 stdout 指向了 output.txt,> 是 1> 的简写。

所以重定向错误信息的输出就应该是这样的:

$ cat nop.txt 2> error.txt

$ cat error.txt
cat: nop.txt: No such file or directory

连个命令连起来就是:

$ cat foo.txt > output.txt 2> error.txt

同时重定向了标准输出stdout与标准错误输出stderr。

回顾开头的那个命令:

ls foo > /dev/null 2>&1

现在基本上已经可以理解了:

  • stdout 重定向到 /dev/null

  • stderr 重定向到 &1

/dev/null 是空设备的意思,重定向到空设备,也就是输出信息不要了。

&1 表示:文件描述符1 的值,也就是标准输出的值,那么 2>&1 就是 标准错误输出 与 标准输出 一样,也是重定向到空设备。

所以这个命令的意思是:正确信息和错误信息都不显示了。

小结

几个关键点:

  • 两个输出:标准输出(stdout 正常信息)、标准错误输出(stderr 错误信息)

  • > 可以改变输出的位置

  • 文件描述符,stdout -> 1,stderr -> 2

  • command > output 是 command 1> output 的简写

  • &文件描述符 是引用某个文件描述符的值

  • 2>&1 是错误输出的位置与标准输出的位置相同

理解 Linux shell 中的一个方言:2>&1的更多相关文章

  1. Linux shell中的一个问题 ${}带正则匹配的表达式

    目前在准备龙芯项目的PMON,在研究其编译过程的时候,看到一些make 语句,百思不得其解.后来在shell编程中看到一点资料,牵扯到Shell中的正则表达式.故记录下来,以备后来查阅. 问题: 在某 ...

  2. [转帖]Linux shell中2>&1的含义解释 (全网最全,看完就懂)

    Linux shell中2>&1的含义解释 (全网最全,看完就懂) https://blog.csdn.net/zhaominpro/article/details/82630528   ...

  3. Linux shell中的竖线(|)——…

    原文地址:Linux shell中的竖线(|)--管道符号作者:潇潇 管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command ...

  4. [转载]Linux shell中的竖线(|)——管道符号

    原文地址:Linux shell中的竖线(|)--管道符号作者:潇潇 管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command ...

  5. Linux Shell中有三种引号的用法

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  6. Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)

    case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下: case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2        ;; *) 默认执行的命令序列  ...

  7. 理解Linux系统中的load average

    理解Linux系统中的load average(图文版) 博客分类: Linux linux load nagios  一.什么是load average? linux系统中的Load对当前CPU工作 ...

  8. linux Shell中常用的条件判断

    linux Shell中常用的条件判断 -b file            若文件存在且是一个块特殊文件,则为真 -c file            若文件存在且是一个字符特殊文件,则为真 -d ...

  9. [转]Linux shell中的那些小把戏

    我日常使用Linux shell(Bash),但是我经常忘记一些有用的命令或者shell技巧.是的,我能记住一些命令,但是肯定不会只在特定的任务上使用一次,所以我就开始在我的Dropbox账号里用文本 ...

随机推荐

  1. inux awk命令详解

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编 ...

  2. Java中的的XML文件读写

    XML简介 要理解XML,HTML等格式,先来理解文档对象模型DOM 根据 DOM,HTML 文档中的每个成分都是一个节点,这些节点组成了一棵树.DOM 是这样规定的:整个文档是一个文档节点每个 HT ...

  3. spark1.4

    spark1.4 Windows local调试环境搭建总结 1.scala版本 scala-2.10.4 官方推荐 scala-2.11.7[不推荐,非sbt项目.需要后加载] 2.spark版本 ...

  4. MySQL的事务

    MySQL的事务 1.事务:事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行. 2.事务具备的四个特性(简称为ACID性): (1)原子性(Atomic ...

  5. BZOJ 3199 escape

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3199 题意:给出n个点.对于平面上任意一点p,p到n个点中的哪个点的距离最近我们就 ...

  6. UVA 1291 十四 Dance Dance Revolution

    Dance Dance Revolution Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  7. Cheatsheet: 2015 01.01~ 01.31

    JAVA JVM Architecture Improving Lock Performance in Java 10 Best Java Tools That Every Java Programm ...

  8. [51NOD1537] 分解(递推,矩阵快速幂)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1537 思路:一开始用二项式拆了一下,发现这个式子的形式总能变成 ...

  9. 使用source Insight工具创建uboot工程。

    首先在linux下面解压uboot的代码.不能在Windows下面解压,因为Windows的文件名是不区分大小写的. 然后,创建网络驱动器,这样就能在Windows下访问linux的文件夹了.方法:通 ...

  10. Linux基础01 学会使用命令帮助

    Linux基础01 学会使用命令帮助 概述 在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档:linux系统内置的帮助文档很详细,通常能解决我们的问题, ...