[转自: http://blog.csdn.net/zjc/article/details/51484114]
command & 这是什么?
命令后面加上&符号,是干啥的? 是为了让命令转入后台运行,我们可以敲其他命令干别的事。
但是有个困扰,当command命令执行出output结果时候,还是会弹出来干扰我们。用这个办法command > output & 就能解决这个问题,它实现了把命令的输出结果重定向输出到output文件中。
但是还有个困扰,当command命令产生了错误输出时候,还是会弹出来干扰我们。用这个办法command > output 2 > error & 就能解决这个问题,它可以把错误输出重定向到error文件中。
command > output & 等同于 command 1 > output &, 把命令的输出重定向到output文件。
0: stdin 标准输入
1: stdout 标准输出
2: stderr 标准错误
有时候我们并不关心output和错误输出的结果,又不想让它们干扰我们,好了那就用这样的办法:
command > /dev/null 2 > /dev/null ,
command > /dev/null 2 > error ,
command > output 2 > /dev/null,其中/dev/null表示空设备,把内容重定向到空设备了,当然就等于该内容没有重定向,说明它不是我们关注的。
如果想把stdout和stderr都重定向到一个文件怎么办呢?
那就用到了2和1之间的重定向。2 > &1 ,用法: command 1 > output 2 > &1 &, 这里2>&1就是把标准错误重定向到标准输出了,标准输出最后重定向到output,那么command命令的stdout和stderr都统一输出到output 文件了。
既然stdout和stderr都重定向到output,那这样写不就好了: command > output 2 > output &。 其实这样是不行的,stdout和stderr的文件名一致的话会冲突。因此想要忽略stdout,stderr就用commad > /dev/null 2 > &1 &
但是使用command > output 2>&1 & 有个问题,那就是每次运行都会覆盖原来的内容,我们想要追加效果就用>>好了:
command >> output 2 >&1 &
另外,上面的命令在shell打开的情况下是没有问题的,如果shell关掉了进程就会结束(例如:关闭窗口,退出ssh登录),我们希望窗口关掉了但是命令还不停歇的执行,就需要加上nohup: nohup command >> output 2>&1 &