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的附加类文件描述符。

posted @   epiphanyy  阅读(11)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示