/dev/null 以及 & 以及2>&1(标准输出标准错误输出,后台运行)(不要用xshell远程测试!要在系统上直接测!)(&>表示全部重定向)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了/dev/null 以及 & 以及2>&1(标准输出标准错误输出,后台运行)(不要用xshell远程测试!要在系统上直接测!)(&>表示全部重定向)相关的知识,希望对你有一定的参考价值。
文章目录
原理
/dev/null
相当于一个文件(垃圾桶)&
表示后台运行2>&1
表示标准错误输出
重定向(等同于)标准输出
(标准输出为1,标准错误输出为2)
这篇文章写得好,可以仔细阅读:
Linux Shell 1>/dev/null 2>&1 含义
command > /dev/null: 将命令的标准输出重定向到垃圾桶, 但是标准错误输出还是一样输出到终端.
还是用 ping 命令举例子. ping zhihu.com > /dev/null 这个结果不会显示输出结果, 因为命令可以成功运行, 所以不会产生错误, 也就不会将标准错误输出到终端;
ping fejiajfmxk.com > /dev/null, 这个命令会显示输出结果, 因为fejiajfmxk.com是个错误的地址, 命令无法成功运行 会报错, 所以会将命令的标准错误输出到终端.
正确的写法1:echo log > /dev/null 2>&1
另外,&>表示全部重定向:ls thereisno &> out.txt 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)
参考文章:shell重定向(大于号,小于号,左右,2>&1,&)
2>&1和>file的顺序问题
注意:> file
相当于1> file
,这个很有用,比如有两个不通顺序的命令command > file 2>&1
和command 2>&1 >file
,前者是2>&1
写在>file
后面,后者是2>&1
写在>file
前面,结果显示两者不同:
command > file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
command 2>&1 >file
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。
测试后台
用xshell连接ubuntu,root用户(测不准,,,相同操作有时这样有时那样,不测了,还是直接在ubuntu上测)(xshell上要加nohup。。。。)
(sleep 5; echo fword) 2>&1 >out.txt &
然后立即关掉窗口,5秒后out.txt有fword(有时文件没内容)
(sleep 5; echo fword) >out.txt 2>&1 &
然后立即关掉窗口,5秒后out.txt文件没有内容
(sleep 5; echo fword> out.txt) &
然后立即关掉窗口,5秒后out.txt文件都没有
(sleep 5; echo fword) > out.txt &
然后立即关掉窗口,5秒后out.txt文件没有内容
直接在ubuntu:(在root用户和普通用户下测试还不一样,我是用root用户测试的)
(sleep 5; echo fword) 2>&1 >out.txt &
然后立即关掉窗口,5秒后out.txt有fword
(sleep 5; echo fword) >out.txt 2>&1 &
然后立即关掉窗口,5秒后out.txt有fword
(sleep 5; echo fword> out.txt) &
然后立即关掉窗口,5秒后out.txt有fword
(sleep 5; echo fword) > out.txt &
然后立即关掉窗口,5秒后out.txt有fword
测试结果:为了保险起见,需要在root用户下运行
测试后台2 在xshell上测试(root用户)我靠,测不准啊!看来远程还是不稳定。。。。(xshell上要加nohup。。。。)
先搞个C++程序,该程序运行后1秒打印一次
root@ubuntu:~# vi /arnold_project/test.cpp
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
while(true)
sleep(1);
cout << "test" << endl;
return 0;
编译:
g++ test.cpp
正常运行后这样:
我们先用命令在一个窗口启动这个程序,然后关掉窗口,然后在另一个窗口用ps -ef | grep a.out
命令查看这个程序是否存在:
./a.out &
然后立即关掉窗口,另一个窗口查看进程不存在
./a.out > /dev/null 2>&1 &
然后立即关掉窗口,另一个窗口查看进程不存在
a.out &
然后立即关掉窗口,另一个窗口查看进程不存在
a.out &
然后立即关掉窗口,另一个窗口查看进程不存在
我靠,测不准啊!结果有时这样有时那样的,,,,看来远程还是不稳定。。。。
把以上测试放到ubuntu上直接测,不通过远程,./a.out &
直接就能在后台运行了,窗口关了也没事
注意:程序中的打印比如printf或者cout属于标准输出,不属于标准错误输出
还是前面的程序,测试方法:
以上是关于/dev/null 以及 & 以及2>&1(标准输出标准错误输出,后台运行)(不要用xshell远程测试!要在系统上直接测!)(&>表示全部重定向)的主要内容,如果未能解决你的问题,请参考以下文章
/dev/null 以及 & 以及2>&1(标准输出标准错误输出,后台运行)(不要用xshell远程测试!要在系统上直接测!)(&>表示全部重定向)
>&/dev/null和>/dev/null 2>&1区别(>/dev/null 2>&1> /dev/null 2>&1)
>&/dev/null和>/dev/null 2>&1区别(>/dev/null 2>&1> /dev/null 2>&1)