Linux shell 脚本中”2>&1″的含义解释

脚本是: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文件中。最后一个& , 是让该命令在后台执行。

试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出。

你可以用:

ls 2>1 测试一下,不会报没有2文件的错误,但会输出一个空的文件1;

ls xxx 2>1 测试,没有xxx这个文件的错误输出到了1中;

ls xxx 2>&1 测试,不会生成1这个文件了,不过错误跑到标准输出了;

ls xxx >out.txt 2>&1,实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。

为何2>&1要写在后面?

# command > file 2>&1

首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

# command 2>&1 >file

2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

用strace可以看到:

1. command > file 2>&1

这个命令中实现重定向的关键系统调用序列是:

open(file) == 3

dup2(3,1)

dup2(1,2)

2. command 2>&1 >file

这个命令中实现重定向的关键系统调用序列是:

dup2(1,2)

open(file) == 3

dup2(3,1)

时间: 2024-10-06 03:46:43

Linux shell 脚本中”2>&1″的含义解释的相关文章

Linux shell脚本中shift的用法说明

Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: run.sh: #!/bin/bash while [ $# != 0 ];do echo "第一个参数为:$1,参数个数为:$#" shift done 输入如下命令运行:run.sh a b c d e f 结果显示如下: 第一个参数为:a

Linux shell脚本中调用另一个shell(exec、source、fork)

  在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh).source(source script.sh).fork(./script.sh) exec(exec /home/script.sh): 使用exec来调用脚本相当于在当前shell执行了一条命令,不会产生新的进程,被执行的脚本会继承当前shell的环境变量.但是当exec调用完毕后,当前shell也会结束,剩下的代码不会执行. source(source /home/script.sh) 使

学习Linux shell脚本中连接字符串的方法

这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"=" echo $value2 把要添加的字符串变量添加{},并且需要把$放到外面. 这样输出的结果是:home=,也就是说连接成功. 又如代码如下: [[email protected] sh]# var1=http://www.3lian.com/etc/ [[email protected] s

Unix/Linux shell脚本中 “set -e” 的作用

"set -e" 是什么? 如下脚本: #!/bin/bash set -e command 1 command 2 ... 在脚本开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出. "set -e" 作用是什么? (1)使用-e帮助你检查错误: (2)防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉: (3)如果要增加可读性,可以使用set -o errexit,它的作用与set -e相同: &quo

linux shell脚本中的延时

linux shell脚本中的延时 还是使用 sleep 或usleep函数. 详细如下:     1.sleep : 默认为秒. sleep 1s 表示延迟一秒   sleep 1m 表示延迟一分钟   sleep 1h 表示延迟一小时   sleep 1d 表示延迟一天        2.usleep : 默认以微秒.   1s = 1000ms = 1000000us 原文地址:https://www.cnblogs.com/sea-stream/p/12076906.html

Linux shell 脚本中使用 alias 定义的别名

核心知识点: 用 shopt 开启和关闭 alias 扩展 交互模式下alias 扩展默认是开启的,脚本模式下默认是关闭的 **** alias 扩展的名称是 expand_aliases alias 定义 在当前session中,可以直接在命令行执行 alias alias-name-define="xxxx" 比如: [email protected]/9 $ alias aliasTest="echo Hello world" [email protected

linux shell脚本中的开头#!/bin/bash的含义

对于linux上需要执行 的shell脚本,通常第一行的内容是 #!/bin/bash 当然有很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 .. 这只是因为在我们常用 的linux系统上默认都是执行/bin/bash来执行我们的shell脚本,但是如果有些用户使用的是csh,那么缺少第一行的“#!/bin/bash的shell脚本执行结果就可能存在语法不兼容的问题,导致结果异常或者根本不能执行. Shell脚本和我们常用的C语言或者C++语言编写编译出来的bin执

Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件

配置文件如下 ##########BACKUP MYSQL CONFIG####### #database name db_name=test db_user=root db_pass=123456 #####backup day config begin ##### day_backupdir=/home/backup/db/day day_backup_fix=day day_interval=1 #####backup day config end ####### #####backup 

一个脚本就能明白Shell 脚本中的位置参数的含义

#!/bin/bashecho '$0 获取当前执行的Shell脚本文件名: ' "$0"echo '$n 获取当前执行的Shell脚本的第n个参数值,n=1..9 ' '$1'=$1,'$2'=$2,'$3'=$3echo '$ 获取当前Shell的所有参数 $1 $2 $3 ...注意与[email protected]的区别:' $echo '$# 获取当前Shell命令行中的参数总个数:' $#echo '$$ 获取当前Shell的进程号(PID): '$$sleep 3 &a