Linux shell命令中的 >&

nohup python3 /home/main.py 2>&1 &

1 和 2 在 shell 命令中代表什么?

img

> 符号的意义

  • > 语法: file_descriptor > file_name

所以2>&1代表将标准错误输出重定向到标准输出中,为什么不能用2>1

答:这代表将错误日志输出到1这个文件中。&可以理解为C语言的指针,加了&1,代表这是一个引用(引用的标准输出)

& 的意义

放在命令最后,代表这条命令放到后台去执行,此时可以执行新的命令了。

nohub的意义

全称 no hangup 即不挂起,即使关掉shell,依然会继续执行。

&nohub的区别和常见使用场景

&代表后台执行,免疫SIGINT信号(Ctrl+C),但是不免疫SIGHUP信号(关闭shell);nohub相反,关闭shell仍会执行,但是Ctrl+C可以中断执行。因此可以将这两个联合使用,让进程既不受Ctrl+C影响,也不受shell关闭影响,类似守护进程。

2>&1为什么要放最后

分别分析这两行命令的逻辑:

nohup java -jar app.jar >log 2>&1 &
nohup java -jar app.jar 2>&1 >log &

第一条命令的逻辑是:

本来1----->屏幕 (1指向屏幕)
执行>log后, 1----->log (1指向log)
执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)

第二条命令的逻辑是

本来1----->屏幕 (1指向屏幕)
执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
执行>log后, 1----->log (1指向log,2还是指向屏幕)

因此,不放最后,会丢失标准错误输出,不符预期。

Posted on 2022-09-27 20:30  奕安  阅读(1123)  评论(0)    收藏  举报