重定向概述

重定向就是将标准输出(本身也是一个文件/dev/stdout)导向一个文件或者追加到一个文件中。在linux中,使用>符号来表示导向到一个文件,使用>>符号来表示追加到一个文件。

# 覆盖文件的内容
echo "hello" > file.txt
# 追加到文件结尾并另起一行
echo "hi" >> file.txt

在linux中,由于标准输入(/dev/stdin)、标准输出(/dev/stdout)、标准错误(/dev/stderr)本质上都是一个文件,这三个文件用于处理系统的输入输出以及错误,而在linux系统中,这三个设备文件对应的文件描述符分别为0、1、2,可以通过这些文件描述符将终端的标准输入作为命令的输入和标准输出作为命令的输出。

# 将cat 的连续输出(heredoc 方式)重定向到一个文件
cat > file.txt

由于标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。标准输出和标准错误虽然都指向终端屏幕,实际它们并不一样。那有的时候我们就是要隐藏某些错误或者警告,那又该怎么做呢。这就需要用到我们前面讲的文件描述符了。

这里假设file.txt文件不存在,那么使用cat file.txt命令就会输出错误,通过2>&1将标准错误重定向到标准输出,这样输出的结果就是标准输出而不是标准错误啦。

cat file.txt > text.txt 2>&1

在 linux 中有一个被称为黑洞的设备文件(/dev/null),所有导入它的数据都将被吞噬。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。

cat file.txt 1>/dev/null 2>&1

重定向命令

tee命令

同时重定向到多个文件,比如将输出重定向到文件,也将信息打印在终端。使用如下命令:

echo 'hello' | tee hello
exec命令

实现永久重定向。使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向。

# 将标准输出重定向到文件file.txt中
exec 1>file.txt
# 此时执行ls命令,输出的内容不会出现在屏幕上,而是输出到了file.txt文件中
ls