【原】Linux shell script 2>&1是什么意思

先说结论,

2>&1 的意思是,把标准错误(stderr)重定向到标准输出(stdout)

如果想了解为什么,可以继续阅读:

1和2 是什么

shell中,有一些常用的文件描述符(file descriptor):

0: 标准输入(stdin)
1: 标准输出(stdout)
2: 标准错误(stderr)

所以 2>&1 中的2就是标准错误,1就是标准输出。

> 符号是什么

">" 是shell中的重定向符, 例如:echo "abc" > file1 就是把abc写到文件名交file1的文件中。
其中要注意的是,一般"1>" 可以简写成">",也就是默认重定向是重定向标准输出。标准输入重定向用"<",标准错误重定向用"2>",这样三个标准文件描述符都能正确的区分重定向了。

&是什么

&符号在shell中有几个意思,在2>&1中, &用做一个“转义符”,和1结合,"&1"一起表示标准输出。
那为什么需要&呢?1不是已经表示标准输出了吗?
那我们假设我们用这样shell script:

cat file1 > outfile 2>1

那这样,系统就会认为,把标准错误输出到文件名是1的文件中。为了消除歧义,&1在这个情景下,才表示标准输出,否则单独的1,就是文件名为1的文件。
如果你看到一个script是:

cat file1 > outfile 2>&1 &

第二个&(command 最后的&),表示command在后台运行,意义与&1中的&不同。

这条命令背后是什么

如果想深入了解一下,可以继续阅读:
这个命令其实是一个dup2()调用。dup2的作用是复制一个现存的文件描述符。

dup2可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。

dup2等效于:

close(oldfd);fcntl(oldfd, F_DUPFD, newfd);

用strace可以看到, command > file 2>&1 这个命令中实现重定向的关键系统调用序列是:

open(file) == 3
dup2(3,1)
dup2(1,2) 

参考文献

linux之dup和dup2函数解析
linux shell 中"2>&1"含义
shell重定向输出(1>&2 2>&1 &>file >&file)

原文地址:https://www.cnblogs.com/youyoubaishu/p/10633011.html

时间: 2024-10-01 04:36:29

【原】Linux shell script 2>&1是什么意思的相关文章

一个修改配置文件的linux shell script

不久以前,曾经搜到一篇博客是读取配置文件的,http://www.cnblogs.com/bo083/archive/2012/11/19/2777076.html,用到现在,感觉十分方便,感谢作者. 现在,需要通过web界面给用户留出接口来修改类似配置文件,大的方法是从php调用linux shell script,于是,现在贴一个可以修改此种配置文件的linux shell. 首先,配置文件的格式如下: [unit1] field1=value1 field2=value2 [unit2]

linux shell script: Basic concept01 - String

basic concept01: String本文所有的测试例如无特殊说明,均based on fish shell 就从字符串说起吧,啥是字符串就不用解释了,我们来看几个简单的例子 ?> ~ set param abc ?> ~ echo "string with blank and $param surrounded with double quotation marks" string with blank and abc surrounded with double

Linux shell Script初识

shell secript: 执行方式的差异: ./ sh执行都是在创建一个子程序来执行,只会继承环境变量, 其中的变量如果export声明,子程序的子程序会继承,不会升级为环境变量 source 的执行方式是把脚本放到父程序的环境执行, 其中的变量如果export声明,会升级成环境变量 test判断,[]判断是一样的,建议使用[]的判断方式 默认变量($0, $1......) $0,$1....位置变量,代表参数 $#:代表参数的个数 [email protected]:代表参数"$1&qu

1&gt;&gt;linux shell script编程

Studying book is <Linux Command Line and Shell Scripting Bible> by Richard Blum and Christine Bresnahan. Thanks. If I have enough time,I will improve this note. Now,I'm coding.

linux shell脚本

定义: linux shell script是一组shell命令组成的批处理文件.类似于windows的bat文件. shell脚本基本语法 每当读取到一个ENTER符号,就开始尝试执行该行的命令. 如果一行的命令太长,可以在行尾使用反斜杠\将命令延续到下一行. [[email protected] testsh]# cat testenter.sh echo zjf is a good man #开头代表注释. 脚本的执行 脚本的执行方式在前几篇文章里有叙述.这里要重点关注这点: sh和./的

跟鸟哥学Linux之——shell script

从程序员的角度来看,Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在系统管理等领域,Shell编程起着不可忽视的作用.前期我对shell编程做了一个初步的认识,现总结如下: 思维导图: 知识分为了两部分: 基本知识: 在基本知识中我将其分为了:执行方法.运算式.变量和判断式四部分.1.执行方法就是在Linux中shell文件执行的命令,用的多了自然会没有问题.2

[Linux Command Line and Shell Scripting Bible] basic shell script

1 #!/bin/bash 2 ############################################ 3 # @content chapter 8,9 of Linux Command Line and Shell Scripting Bible 4 # @reader gavin 5 # @date 2014/12/14 6 ############################################ 7 CHAPTER 8 8 9 + user varriab

Unix/Linux shell脚本编程学习--Shell Script II

Shell Script II 10.Shell echo命令 echo "OK!\n”   #显示换行 echo "It is a test" echo无拼接字符时后一般可以不使用”引号”,从上面可看出,双引号可有可无,单引号主要用在原样输出中. 显示结果重定向保存至文件: vim myfile 创建文件 echo "It is a test" > myfile cat myfile 查看文件内容 若需要原样输出字符串(不进行转义),请使用单引号.

Linux 脚本运维总结之Shell script

1. 本地变量和环境变量 变量类型 定义形式 声明位置 显示命令 作用域 本地变量 VARNAME=value 命令行或shell脚本 set (显示所有变量) 本用户,本进程 环境变量 export VARNAME=value ~/.bash_profile (当前登陆用户有效)/etc/profile (所有登陆用户有效) env(仅显示环境变量) 所有用户所有进程 2. 脚本调试 法一 #!/bin/bash -x 法二 set -x 要调试的几行代码 set +x 3. 退出状态 exi