
之前一直看到有这样的命令 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 | $ cat hello.txt |
“Hello World”即是文件hello.txt的内容,它被输出到了终端上。我们可以利用>
将这个输出位置重定向到我们期望的文件中
1 | $ cat hello.txt > out.log |
这里的>
就是一个输出重定向符,可以看到,第一条命令在终端上没有任何输出,第二条命令则在终端上打印了文件的内容。实际上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 | $ cat hello.txt |
即使我们尝试这样重定向输出,错误信息还是会被打印到终端上:
1 | $ cat hello.txt > output.txt |
因为这一条命令仅仅重定向了stdout,而stderr还是被默认指向了终端。
因此,如果你不想在屏幕上看到出错打印,可以采取的办法就是重定向 stderr(重新改变 sterrr 的输出方向),将其指向其他的设备,譬如一个文件。和 stdout 类似,stderr在Shell中也有自己的代号是2
,并参考前面标准输出的完整写法,我们可以写出如下形式:
1 | $ cat hello.txt 2> log.txt |
标准输出和标准出错同时重定向
通过上面的分析,大概能够猜出2>&1
命令的含义了。其中&1
是stdout引用的写法,如果替换成1
,Shell会认为1
是某一文件的名称,该命令的含义为将stderr的输出重定向到stdout。回头看这条命令:
1 | nohup start.sh > log.txt 2>&1 & |
它表示了将start.sh
的stdout和stderr同时重定向到log.txt文件,需要注意的是这里的>
和&1
之间不可以有空格。