文章目录

  • 1.命令:nohup command>/dev/null 2>&1 &
  • 2.为何2>&1要写在后面?

1.命令:nohup command>/dev/null 2>&1 &

  • 首先就是一个nohup:表示当前用户和系统的会话下的进程忽略响应HUP消息。
  • &是把该命令以后台的job的形式运行。
  • command>/dev/null较好理解,/dev/null表示一个空设备,就是说把 command 的执行结果重定向到空设备中,说白了就是不显示任何信息。
    可以把/dev/null 可以看作”黑洞”。它等价于一个只写文件。所有写入它的内容都会永远丢失,而尝试从它那儿读取内容则什么也读不到。
command>/dev/null的说明:

对于一个重定向命令,肯定是a > b这种形式,那么command > /dev/null难道是command 充当 a 的角色,/dev/null 充当 b 的角色。

这样看起来比较合理,其实一条命令肯定是充当不了 a,肯定是 command 执行产生的输出来充当 a,其实就是标准输出 stdout。
所以command > /dev/null相当于执行了command 1 > /dev/null。
执行 command 产生了标准输出 stdout(用1表示),重定向到/dev/null的设备文件中。
  • 2>&1含义:
    (1)/dev/null 表示空设备文件;
    (2)0 表示stdin标准输入;
    (3)1 表示stdout标准输出;
    (4)2 表示stderr标准错误。
  • 2>1和2>&1的写法有什么区别:
(1)2>1的作用是把标准错误的输出重定向到1,但这个1不是标准输出,而是一个文件!!!,文件名就是1;
(2)2>&1的作用是把标准错误的输出重定向到标准输出1,&指示不要把1当作普通文件,而是fd=1即标准输出来处理。

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

  • index.php task testOne >/dev/null 2>&1

我们可以理解为,左边是标准输出,好,现在标准输出直接输入到/dev/null中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。

可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件

  • eg:
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了。