shell 中的>文件重定向符 和 标准输入、输出、错误以及 2&1 的含义*
1.问:其中 的2>&1是怎么回事?
. test.sh > test.log 2>&1
2.答:>和<是 文件重定向符。
在shell中,每个进程都和三个系统文件相关联:
- 标准输入stdin,文件描述符为0
- 标准输出stdout,文件描述符为1
- 标准错误stderr,文件描述符为2
所以这里2>&1的意思就是将标准错误也输出到标准输出当中。
3.示例
下面通过一个例子来展示2>&1有什么作用:
1,准备一个脚本test.sh,内容如下:
t
date
test.sh中包含两个命令,其中t是一个不存在的命令,执行会报错,默认情况下,错误会输出到stderr。date则能正确执行,并且
输出时间信息,默认输出到stdout.
2,执行比较
命令 |
终端打印 |
文件内容 | 注释 |
. test.sh |
t:未找到命令 2016年 11月 08日 星期二 13:31:07 CST |
无输出 | 无文件 |
. test.sh > test.log |
t:未找到命令 |
2016年 11月 08日 星期二 13:34:32 CST |
可以看到,date的执行结果被重定向到log文件中了, 而t无法执行的错误则只打印在屏幕上。 |
. test.sh > test2.log 2>&1 | 无输出 | t:未找到命令 2016年 11月 08日 星期二 13:45:56 CST |
这次,stderr和stdout的内容都被重定向到log文件中了。 |
实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了(stderr已作为
stdout的副本),那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使
用2> file。
那么如何将标准错误输出重定向到一个文件的同时在屏幕上也显示?
[root@home root]# id fdfd 2>&1 |tee logfile
id: fdfd: No such user
[root@home root]# cat logfile
id: fdfd: No such user
管道的用途是把进程的标准输出连接到另一个进程的标准输入,2>&1是把标准错误作为标准输出的副本。在楼顶那个命令里,把标
准输出和标准错误都输出作为tee命令的标准输入,tee的用途是把标准输入的副本拷贝到文件,并输出。不要混淆管道与重定向,
这是两个不同的概念。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?