Skip to content

[!quote] 重定向 重定向 就是将标准输出到终端的数据重定向到一个文件中,因为标准输出本身也是一个文件 /dev/stdout


  • > 将标准输出导向一个文件
  • >> 讲标准输出追加到一个文件

简单重定向

bash
echo 'hello' > redirect
echo 'world' >> redirect
cat redirect

---
hello
world

文件描述符

[!quote] 文件描述符

文件描述符 是一个索引值,指向该进程打开文件的记录表

当程序打开一个现有文件或者创建一个新文件时,内核就会向进程返回一个文件描述符,并用这个文件描述符来访问和管理文件,当程序需要对文件进行操作时,它会提供文件描述符给操作系统,操作系统会根据这个文件描述符找到对应的文件并进行操作

每个文件描述符都是唯一的,是正在被访问文件的唯一标识

文件描述符设备文件说明
0/dev/stdin标准输入
1/dev/stdout标准输出
2/dev/stderr标准错误输出
3 - 8默认不开启

  • 查看当前 Shell 中打开的文件描述符
bash
cd /dev/fd/;ls -Al

  • 开启文件描述符
bash
# 创建了3文件描述符,并定位到somefile文件
exec 3>somefile

  • 关闭文件描述符
bash
exec 3>&-

复杂重定向

标准输出重定向

  • 使用文件描述符
bash
# 标准输入作为命令的输入,标准输出作为命令的输出
cat #

  • 多行命令一次性重定向
mermaid
graph LR
	a[字符]--被EOF输入给-->b[cat]
	b--重定向给-->c[test.c]
bash
mkdir Documents

# <<EOF 表示以EOF为终止符,将输出的字符作为cat的输入,cat再将这段字符重定向到test.c中
cat <<EOF >Documents/test.c
#include <stdio.h>

int main()
{
    printf("hello world\n");
    return 0;
}

EOF

标准错误输出重定向

  • 标准错误输出不会重定向到文件【默认】
bash
# 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
cat Documents/test.c hello.c

# 将输出重定向到一个文件
cat Documents/test.c hello.c > somefile
  • 标准错误输出重定向到文件
bash
# 将标准错误重定向到标准输出,再将标准输出重定向到文件
cat Documents/test.c hello.c >somefile  2>&1

# "&"将标准错误和标准输出同时重定向到文件
cat Documents/test.c hello.c &>somefilehell

重定向到多个文件

  • tee 覆盖重定向
    • -a 追加重定向
bash
# 在屏幕上显示 `ls` 命令的输出,并同时将输出保存到 `file1.txt` 和 `file2.txt` 两个文件中
ls | tee file1.txt file2.txt

# 输出会追加到两个文件的末尾
ls | tee -a file1.txt file2.txt

持久重定向

[!hint] 在某些时候,我们需要某一部分命令的输出全部进行重定向,我们不可能在每个命令上都做重定向的操作

  • exec 持久重定向
  • exec 文件描述符>文件 创建一个文件描述符
bash
# 先开启一个子 Shell
bash

# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
exec 1>somefile
ls
exit

cat somefile
bash
bash
exec 3>somefile

echo "this is test" >&3
cat somefile
exit

空重定向

[!quote] /dev/null

/dev/null 是一个特殊文件

  • 任何写入 /dev/null 的数据都会被系统丢弃
  • 从 /dev/null 读取数据,你会立即得到一个 EOF【空文件】