标签:内容 生成 nohup google linux 读取 区别 shell命令 参考
shell上:
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
在计划任务中经常可以看到。例如我们公司的计划任务举例:
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1 */2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。
为何2>&1要写在后面?
index.php task testOne >/dev/null 2>&1
我们可以理解为,左边是标准输出,好,现在标准输出直接输入到 /dev/null 中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。
可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件
你可以用
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了
于2>&1的含义
(关于输入/输出重定向本文就不细说了,不懂的可以参考这里,主要是要了解> < << >> <& >& 这6个符号的使用)
含义:将标准错误输出重定向到标准输出
符号>&是一个整体,不可分开,分开后就不是上述含义了。
比如有些人可能会这么想:2是标准错误输入,1是标准输出,>是重定向符号,那么"将标准错误输出重定向到标准输出"是不是就应该写成"2>1"就行了?是这样吗?
如果是尝试过,你就知道2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了
写成2&>1也是不可以的
为什么2>&1要放在后面
考虑如下一条shell命令
nohup java -jar app.jar >log 2>&1 &
(最后一个&表示把条命令放到后台执行,不是本文重点,不懂的可以自行Google)
为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?
我们不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:
1、本来1----->屏幕 (1指向屏幕)
2、执行>log后, 1----->log (1指向log)
3、执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
再来分析下
nohup java -jar app.jar 2>&1 >log &
1、本来1----->屏幕 (1指向屏幕)
2、执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
3、执行>log后, 1----->log (1指向log,2还是指向屏幕)
所以这就不是我们想要的结果。
每次都写">log 2>&1"太麻烦,能简写吗?
有以下两种简写方式
1、&>log 2、>&log
比如上面小节中的写法就可以简写为:
nohup java -jar app.jar &>log &
上面两种方式都和">log 2>&1"一个语义。
那么 上面两种方式中&>和>&有区别吗?
语义上是没有任何区别的,但是第一中方式是最佳选择,一般使用第一种
标签:内容 生成 nohup google linux 读取 区别 shell命令 参考
原文地址:https://www.cnblogs.com/damong/p/12272065.html