shell基础知识之 stdin,stdout,stderr和文件描述符
stdin,stdout,stderr
stdin=0
stdout=1
stderr=2
使用tee来传递内容,把stdout 作为stdin 传到下个命令
root@172-18-21-195:/tmp/pratice# echo "who is this" | tee - # -相当于传入到stdout,所以打印2次
who is this
who is this
root@172-18-21-195:/tmp/pratice# echo "who is this" | tee - | cat -n # cat -n 是显示行数
1 who is this
2 who is this
把stderr给导入指定地方
root@172-18-21-195:/tmp/pratice# ls asdf out.txt 2>/dev/null 1>/dev/null
root@172-18-21-195:/tmp/pratice# ls asdf out.txt &>out.txt # 可以简写成这样,也可以写成2>&1 这样,二选一
root@172-18-21-195:/tmp/pratice# cat out.txt
ls: cannot access asdf: No such file or directory
out.txt
1. 将文件重定向到命令
借助小于号(<),我们可以像使用stdin那样从文件中读取数据:
$ cmd < file
2. 重定向脚本内部的文本块
可以将脚本中的文本重定向到文件。要想将一条警告信息添加到自动生成的文件顶部,可以
使用下面的代码:
root@172-18-21-195:/tmp/pratice# cat << EOF >log.txt
> this is a test for log.txt
> EOF
root@172-18-21-195:/tmp/pratice# cat log.txt
this is a test for log.txt
出现在cat <
log.txt文件的内容显示如下:
3. 自定义文件描述符
文件描述符是一种用于访问文件的抽象指示器(abstract indicator)。存取文件离不开被称为
“文件描述符”的特殊数字。 0 、 1 和 2 分别是 stdin 、 stdout 和 stderr 预留的描述符编号。
exec 命令创建全新的文件描述符。如果你熟悉其他编程语言中的文件操作,那么应该对文
件打开模式也不陌生。常用的打开模式有3种。
- 只读模式。
- 追加写入模式。
- 截断写入模式。
< 操作符可以将文件读入 stdin 。 > 操作符用于截断模式的文件写入(数据在目标文件内容被
截断之后写入)。 >> 操作符用于追加模式的文件写入(数据被追加到文件的现有内容之后,而且
该目标文件中原有的内容不会丢失)。文件描述符可以用以上3种模式中的任意一种来创建。
创建一个用于读取文件的文件描述符
[root@dns-node2 tmp]# cat input.txt
aaa
bbb
ccc
[root@dns-node2 tmp]# exec 3<input.txt # 创建一个新的描述符3, 3和<和input.txt之间千万不能有空格,必须紧挨着。
[root@dns-node2 tmp]# cat <&3
aaa
bbb
ccc
如果要再次读取,我们就不能继续使用文件描述符 3 了,而是需要用 exec 重新创建一个新的
文件描述符(可以是 4 )来从另一个文件中读取或是重新读取上一个文件。
创建一个用于写入(截断模式)的文件描述符:
[root@dns-node2 tmp]# exec 4>output.txt
[root@dns-node2 tmp]# echo newline >&4 # &在这里可以理解为获取4这个FD的内存地址(个人理解,该理解来自go语言)
[root@dns-node2 tmp]# cat output.txt
newline
追加模式
[root@dns-node2 tmp]# exec 5>>input.txt
[root@dns-node2 tmp]# echo Append line >&5
[root@dns-node2 tmp]# cat input.txt
aaa
bbb
ccc
Append line
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构