[!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 somefilebash
bash
exec 3>somefile
echo "this is test" >&3
cat somefile
exit空重定向
[!quote]
/dev/null
/dev/null是一个特殊文件
- 任何写入
/dev/null的数据都会被系统丢弃- 从
/dev/null读取数据,你会立即得到一个 EOF【空文件】