nohup中2>&1是什么意思
Miyagi Lv1

之前一直看到有这样的命令 nohup xxx.sh > log.log 2>&1 &,对其中的2>&1作用一直不是很清楚,查阅了相关资料后,在此记录一下。


nohup命令用法

nohup命令全称no hang up,即不挂起,用于在退出终端后不中断的继续执行某一命令。该命令会默认输出一个nohup.txt的文件到当前路径下,如果该文件不可写则会将输出重定向到 $HOME/nohup.txt

语法格式

1
nohup Command [Arg ...] [&]

Command:具体要执行的命令
Arg:相关参数,或者是重定向输出的文件
**&**:让命令在终端退出后可以继续执行

示例

1
nohup start.sh > log.txt 2>&1 &

2>&1含义说明

标准输出重定向(stdout)

当我们想看到一个可读文件的具体内容时,通常会使用cat命令,文件中的内容会被打印到终端上显示。

1
2
$ cat hello.txt
Hello World

“Hello World”即是文件hello.txt的内容,它被输出到了终端上。我们可以利用>将这个输出位置重定向到我们期望的文件中

1
2
3
4
$ cat hello.txt > out.log

$ cat out.log
Hello World

这里的>就是一个输出重定向符,可以看到,第一条命令在终端上没有任何输出,第二条命令则在终端上打印了文件的内容。实际上cat hello.txt > out.log是一种简写方式,它的完整写法应该如下:

1
$ cat hello.txt 1> out.log

其中:

  • 1是标准输出(stdout)的文件描述符(File descriptor)
  • 1>之间不可以有空格,1> out.log表达了stdout指向了文件out.log
  • >out.log之间可以没有空格

标准出错重定向

如果在shell中执行的命令发生了错误,比如cat了一个一个不存在的文件,Shell会输出错误信息,即标准出错(stderr)。同样的,stderr会被默认输出到终端上,如下所示:

1
2
$ cat hello.txt
cat: hello.txt: No such file or directory

即使我们尝试这样重定向输出,错误信息还是会被打印到终端上:

1
2
$ cat hello.txt > output.txt
cat: hello.txt: No such file or directory

因为这一条命令仅仅重定向了stdout,而stderr还是被默认指向了终端。
因此,如果你不想在屏幕上看到出错打印,可以采取的办法就是重定向 stderr(重新改变 sterrr 的输出方向),将其指向其他的设备,譬如一个文件。和 stdout 类似,stderr在Shell中也有自己的代号是2,并参考前面标准输出的完整写法,我们可以写出如下形式:

1
2
3
4
$ cat hello.txt 2> log.txt

$ cat log.txt
cat: hello.txt: No such file or directory

标准输出和标准出错同时重定向

通过上面的分析,大概能够猜出2>&1命令的含义了。其中&1是stdout引用的写法,如果替换成1,Shell会认为1是某一文件的名称,该命令的含义为将stderr的输出重定向到stdout。回头看这条命令:

1
nohup start.sh > log.txt 2>&1 &

它表示了将start.sh的stdout和stderr同时重定向到log.txt文件,需要注意的是这里的>&1之间不可以有空格

 评论