1. 前言
有时候我们常看到类似这样的脚本调用:
./test.sh > log.txt 2>&1
这里的2>&1是什么意思?该如何理解?
先说结论:
上面的调用表明将./test.sh的输出重定向到log.txt文件中,同时将标准错误也重定向到log.txt文件中。
以这样的方式调用脚本,可以很好的将错误信息保存,帮助我们定位问题。
2. 2>&1 原理
每个程序在运行后,都会至少打开三个文件描述符,分别是:
0:标准输入;
1:标准输出;
2:标准错误。
2>&1 表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。在前面我们知道,test.sh >log.txt又将文件描述符1的内容重定向到了文件log.txt,那么最终标准错误也会重定向到log.txt。
3. /dev/null
在 Linux 系统中,/dev/null 是一个特殊的文件,用于将数据彻底丢弃。它是一个特殊的文件设备,可以通过标准输入和标准输出访问。读取 /dev/null 将会立即返回 EOF(文件结束符),而向它写入任何数据将会直接被忽略掉,从而丢弃数据。
因为 /dev/null 丢弃所有数据,所以它通常用于一些需要忽略输出或者输入的场合。例如,如果你正在运行一个命令,但是你不想看到输出,你可以将输出重定向到 /dev/null。类似的,如果你需要一个空的输入流来执行一个命令,你可以将输入重定向到 /dev/null。
1)重定向输出
ls > /dev/null
在这个例子中,输出被重定向到 /dev/null,因此不会在屏幕上打印任何输出。
2)禁止输出和标准错误输出
如果你希望同时禁止输出和错误输出,你可以将标准输出和标准错误输出都重定向到 /dev/null。例如,以下命令将不会输出任何内容,即使命令本身存在错误:
ls /not/a/real/path > /dev/null 2>&1