shell 编程之2>&1含义

http://blog.csdn.net/gyanp/article/details/7258356

经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用

/tmp/test.sh > /tmp/test.log 2>&1

前半部分/tmp/test.sh > /tmp/test.log很容易理解,那么后面的2>&1是怎么回事呢?

要解释这个问题,还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么?

在shell中,每个进程都和三个系统文件相关联:标准输入stdin,标准输出stdout和标准错误stderr,三个系统文件的文件描述符分别为0,1和2。所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。

下面通过一个例子来展示2>&1有什么作用:

$ cat test.sh
t
date

test.sh中包含两个命令,其中t是一个不存在的命令,执行会报错,默认情况下,错误会输出到stderr。date则能正确执行,并且输出时间信息,默认输出到stdout

./test.sh > test1.log
./test.sh: line 1: t: command not found

$ cat test1.log
Tue Oct 9 20:51:50 CST 2007

可以看到,date的执行结果被重定向到log文件中了,而t无法执行的错误则只打印在屏幕上。

$ ./test.sh > test2.log 2>&1

$ cat test2.log
./test.sh: line 1: t: command not found
Tue Oct 9 20:53:44 CST 2007

这次,stderr和stdout的内容都被重定向到log文件中了。

实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了,那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使用2> file

如:

nohup /mnt/Nand3/H2000G  >/dev/null  2>&1  &
      对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0 表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
      command >out.file  2>&1 &
      command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

时间: 2024-11-10 01:28:15

shell 编程之2>&1含义的相关文章

shell编程之array

变量 : 内存空间 类型 shell编程中所有变量类型为字符类型array 数组 数组中变量叫做element (元素) ,数组中每个元素都用索引位置来标注声明数组declare -a ARRAY_NAME赋值方法1 :AA[0]=jerry赋值方法2 :br/>AA={jerry,tom,lucy}数组实例![](https://s1.51cto.com/images/blog/201907/09/d85fa8a4c0a1da0c0a4e8975ba9d285f.png?x-oss-proce

Shell编程之Expect免交互

Shell编程之Expect免交互 Expect概述 Expect安装 Expect基本命令 Expect执行方式 Expect案例 Expect概述 Expect Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.对于大规模的linux运维很有帮助 在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息.为了模拟这种输入,可以使

shell编程之case分支语句

shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 如果里面匹配到固定值:或某个变量存在多中取值,需要对其中的每一个取值分别执行不同的命令序列. case只是判断一个变量的不同取值. case的模式: 执行流程: 首先使用"变量值"与模式1进行比较,如果取值相同就执行模式1的命令序列1,直到遇见" ;; "后跳转到es

无标题文章shell编程之Expect免交互

shell编程之Expect免交互 前言 一:Expect概述 Expect是建立在tcl基础上的一个工具,Expect是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题,对于大规模的linux运维很有帮助 在Linux运维和开发中,我们经常需要远程登录服务器进行操作,在登录的过程是一个交互的过程,可能会需要输入yes/no password等信息. 为了模拟这种输入,可以使用Expect脚本 二:Expect基本命令 2.1:Expect安装 系统一般不自带,需要自己安装

shell编程之if语句

目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other shell编程之if判断 1.整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a&

shell编程之grep命令的使用

大家在学习正则表达式之前,首先要明确一点,并把它牢牢记在心里,那就是: 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,不要把二者搞混了.切记!!! 通常有三种文本处理工具/命令:grep.sed.awk,它们三者均可以解释正则.下面我就为大家介绍grep命令的使用方法. 一.使用grep命令搜索文件中的内容 grep和egrep命令能够在一个或多个文件的内容中搜索某一特定的字符模式,也被称为正则表达式(regular expressions).一个模式可以是一个单一的

shell编程之echo printf 命令

shell中 echo 和printf 都能用作输出,printf可以算是echo的增强版 显示转义字符 echo \""abcdef\"" >>> "abcdef" 显示变量 age=23 echo "my age is $age" >>>my name is 23 在使用的过程中,为了避免引起歧义,多使用${age} 显示换行 echo “ok\n“ echo "my name

shell编程之awk

GNU awk AWK:Aho,Weinberger,Kernighan GNU awk --> gawk#ll `which awk`    /usr/bin/awk -> gawk 报表生成器,格式化文本输出; #man awk    pattern scanning and processing language.    模式扫描和处理语言;    基本用法:    awk [option] 'program' file        program: PATTERN{ACTION ST

linux下shell编程之mysql备份(适合初学者)

1,shell常见变量解析: $0 当前脚本的名称 $n 当前脚本的第n个参数 $* 当前脚本的所有参数(不包括程序本身) $# 当前脚本的参数个数(不包括程序本身) $?命令或程序执行完成后的状态,一般返回0表示成功. $UID当前用户的ID $PWD当前所在的目录 -ne 不等于 -eq 等于 2,自动备份mysql脚本思路 ①,备份DB的命令 mysqldump -h127.0.0.1 -uroot -p123456 du >du_`date +%y%m%d`.sql ②,备份的机制 ③,