【shell】—如何理解调用shell脚本后面加上”2>&1“及其他重定向字符


一、前景

调用shell中脚本到后台运行,会将运行日志文件写入一个带.log文件中,.log后面常常加入 2>&1,最后**&**表示把这条命令放到后台执行。

nohup sh /root/model_name/script/black_table_stat.sh > /root/model_name/log/black_table_stat_1_$(date +"%Y%m%d%H").log 2>&1 &

二、了解 0、1、2 在linux中含义

名称 代码 操作符
标准输入 0 < 或 <<
标准输出 1 >,>>,1>或1>>
标准错误输出 2 2>或2>>

举例说明:
当前目录存在test.txt 文件,不存在b.txt文件。

[wqf@b1i10 ~]$ ls test.txt
test.txt
[wqf@b1i10 ~]$ ls b.txt
ls: cannot access b.txt: No such file or directory

把正常内容输出到文件file.out,错误内容输出到文件file.err。

[wqf@b1i10 ~]$ ls test.txt b.txt 1>file.out 2>file.err
[wqf@b1i10 ~]$ cat file.out
test.txt
[wqf@b1i10 ~]$ cat file.err
ls: cannot access b.txt: No such file or directory

三、各种重定向的含义

1、2>&1的含义

含义:将标准错误输出重定向到标准输出
符号>&是一个重定向符号,表示将标准错误输出加入到标准输出 。
可以理解:
1、本来1(标准输出)输出到屏幕
2、执行>log,将1(标准输出)输出到log文件
3、执行2>&1,将2(标准错误输出)加入到1(标准输出),因为1(标准输出)输出到log文件,因此2(标准错误输出)也指向了log。

例如:

nohup sh /root/model_name/script/black_table_stat.sh > /root/model_name/log/black_table_stat.log 2>&1 &

查看black_table_stat.log会发现里面既有正常输出内容又有错误输出内容。

2、&>file 的含义

将1(标准输出)和2(标准错误输出)都重定向到文件file中,与**>log 2>&1**的含义一样。

例如:

nohup sh /root/model_name/script/black_table_stat.sh > /root/model_name/log/black_table_stat_1_$(date +"%Y%m%d%H").log 2>&1 &

## 可以简写为以下:
nohup sh /root/model_name/script/black_table_stat.sh &> /root/model_name/log/black_table_stat_1_$(date +"%Y%m%d%H").log &

语义上是没有任何区别的,一般使用第一种一般用第一种“>log 2>&1”

3、1>&2 的含义

含义:将标准输出重定向到标准错误输出
符号>&是一个重定向符号,表示将标准错误输出加入到标准输出 。
可以理解为:
1、本来1(标准输出)输出到屏幕。
2、执行>log,将1(标准输出)输出到log文件。
3、执行1>&2,将1(标准输出)加入到2(标准错误输出),因为2(标准错误输出)还是指向屏幕。

我们在终端敲命令错误屏幕就会报错,可以将屏幕报错显示的地方当成标准错误输出通道2。
例如:

[wqf@b1i10 ~]$ sh /apps/summary_fz_province/test.sh > /apps/summary_fz_province/test.log 1>&2
$*=
$@=
print each param from 
print each param from 

运行结果,查看test.log里面什么都没有,屏幕会输出运行test.sh的正常内容。

4、 /dev/null 的含义

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。

如果希望屏蔽 标准输出 和 标准错误输出,可以这样写:

command > /dev/null 2>&1

可以理解为:
1、本来1(标准输出)输出到屏幕
2、执行> /dev/null,将1(标准输出)输出到/dev/null文件
3、执行2>&1,将2(标准错误输出)加入到1(标准输出),因为1(标准输出)输出到/dev/null文件,因此2(标准错误输出)也指向了/dev/null。

猜你喜欢

转载自blog.csdn.net/sodaloveer/article/details/130349575