Linux文件描述符和重定向
文件描述符:
0:stdin(标准输入)
1:stdout(标准输出)
2:stderr(标准错误)
成功和不成功的命令:
[student@myhost ~]$ ls +
ls: cannot access +: No such file or directory
[student@myhost ~]$ echo $? #命令出错,$?返回非零错误值
2
[student@myhost ~]$ ls a
a
[student@myhost ~]$ echo $? #命令成功,$?返回成功值0
0
重定向输出:
[student@myhost ~]$ find . -name a
./a
find: ‘./testdir’: Permission denied
[student@myhost ~]$ find . -name a 1>stdout.txt 2>stderr.txt
[student@myhost ~]$ cat stdout.txt
./a
[student@myhost ~]$ cat stderr.txt
find: ‘./testdir’: Permission denied
[student@myhost ~]$ find . -name a > d #只用>仅会将stdout重定向到文件
find: ‘./testdir’: Permission denied
[student@myhost ~]$ cat d
./a
[student@myhost ~]$ find . -name a &> d #使用&>可将stdout和stderr重定向到文件
[student@myhost ~]$ cat d
./a
find: ‘./testdir’: Permission denied
[student@myhost ~]$ find . -name a 1>d 2>&1 #使用"1>文件名 2>&1"也可完成stdout和stderr重定向到同一文件
[student@myhost ~]$ cat d
./a
find: ‘./testdir’: Permission denied
tee命令:
[student@myhost ~]$ find . -name a | tee d
find: ‘./testdir’: Permission denied
./a
[student@myhost ~]$ cat d
./a
以上我们可以看出tee命令会将stdout写入d中,并显示一份副本到显示器。
[student@myhost ~]$ find . -name a | tee d | cat -n
find: ‘./testdir’: Permission denied
1 ./a
[student@myhost ~]$ cat d
./a
以上我们可以发现第一个find命令执行完之后|命令会将stdout做为stdin发送给tee命令,同时将stderr打印到屏幕上,tee命令将stdin保存到d中,同时|将stdout作为stdin传给cat命令,cat -n以显示行数的方式将上一级传送过来的stdin打印出来。
默认情况下,tee命令会将文件中内容覆盖,可以加一个-a选项指定为附加。
我们也可以将stderr变为stdout:
[student@myhost ~]$ find . -name a 2>&1 | tee d
./a
find: ‘./testdir’: Permission denied
[student@myhost ~]$ cat d
./a
find: ‘./testdir’: Permission denied
从文件中读取stdin:
[student@myhost ~]$ cat a
hhh
[student@myhost ~]$ tee <a d
hhh
[student@myhost ~]$ cat d
hhh
重定向文件内部文本块:
[student@myhost ~]$ cat a
cat<<EOF>log.txt
LOG FILE HEADER
This is a test log file.
EOF
[student@myhost ~]$ bash a
[student@myhost ~]$ cat log.txt
LOG FILE HEADER
This is a test log file.
自定义文件描述符:
[student@myhost ~]$ echo This is a test line > b
[student@myhost ~]$ exec 3<b
[student@myhost ~]$ cat <&3
This is a test line
以上为创建一个stdin类型的文件描述符。
[student@myhost ~]$ exec 4>out
[student@myhost ~]$ echo This is a test line >&4
[student@myhost ~]$ cat out
This is a test line
以上为创建一个stdout的截断类文件描述符。
[student@myhost ~]$ echo a line > hhh
[student@myhost ~]$ exec 6>>hhh
[student@myhost ~]$ echo a new line >&6
[student@myhost ~]$ cat hhh
a line
a new line
以上为创建一个stdout的附加类文件描述符。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)