/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远程测试!要在系统上直接测!)(&>表示全部重定向)

zero和null以及sparse

>&/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)

>/dev/null 2>&1 这句话的含义及使用的意义

shell脚本,通过传入的参数来计算最大值和最小值以及平均值。