Linux中重定向应注意的事情
引言
你是否见过bash ... 2>&1 1>file.txt的写法? 还没发现这样的写法有什么问题? 那么恭喜你, 看完本文你又将学会一个新知识!
重定向的错误用法
以引言中命令为例, 2>&1表示将错误输出重定向到标准输出, 1>file.txt表示将标准输出重定向到file.txt文件, 看起来的意思就是将标准输出和错误输出全都重定向到file.txt?
错啦! 上述命令只会标准输出重定向到file.txt文件, 而错误输出还是重定向到终端(或者叫做命令行, 控制台, 屏幕). 因为首先解析的是2>&1,此时的1指向的还是标准输出, 即终端, 解析到1>file.txt时, 标准输出才被重定向到file.txt. 下面我将用一个例子来验证我的结论:
test.sh是一个简单的脚本, 会把STDOUT输出到标准输出, 将STDERR输出到错误输出
$ cat test.sh
echo 'STDOUT' >&1
echo 'STDERR' >&2
我们先验证脚本的正确性, 标准输出和错误输出都被正确的捕捉到了, 脚本可以同时输出标准输出和错误输出, 正确性得以验证.

现在我们再来验证我一开始的结论, 执行bash ... 2>&1 1>file.txt形式的命令, 可以看到错误输出STDERR被输出到了终端, 而file.txt中仅有标准输出STDOUT

那么应该怎么改成我们想要的结果呢? 很简单, 将2>&1和1>file.txt调换个位置即可, 即bash ... 1>file.txt 2>&1; 或者使用bash ... &>file.txt, 都可以达到我们想要的效果


重定向另外一个值得注意的事项
重定向另外一个需要注意的事项就是: 执行类似于command > file.txt的命令时, 会首先判断file.txt是否存在, 若存在则先清空文件, 若不存在则创建文件, 随后才会执行command
假设有一个已经排好序的文件file.txt, 我们对这个文件去重的话, 执行uniq file.txt > file.txt会直接清空文件

想要不生成额外的临时文件做到去重的话, 正确的做法应该是使用管道|配合tee命令, 而不是使用重定向

Linux中重定向应注意的事情的更多相关文章
- Linux中重定向及管道
1重定向1.1 重定向符号 > 输出重定向到一个文件或设备 覆盖原来的文件 >! 输出重定向到一个文件或设备 强制覆盖原来的 ...
- linux中重定向的用法
用法: 1> | > file:标准输出覆盖重定向(先清空文件,后加入内容) 1>> | >> file:标准输出追加重定向(将内容追加到文件的末尾) 2> ...
- Linux中重定向
转:http://blog.csdn.net/songyang516/article/details/6758256 1重定向 1.1 重定向符号 > 输出 ...
- Linux中重定向--转载
转:http://blog.csdn.net/songyang516/article/details/6758256 1重定向 1.1 重定向符号 > 输出 ...
- Linux中重定向命令行
http://www.ahlinux.com/start/base/3170.html
- <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向
[root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...
- linux中的输入从定向和输出重定向
linux的标准的输入和输出为如下 我们在 linux中执行命令时,命令默认输出到console中,很多时候我们需要将命令输出到其他设备上如最常见的就文件中去,或者重文件中输入.那这时候就需要用到li ...
- linux中nginx重定向方法总结
linux中nginx 301重定向跳转方法总结 第一种情况:访问aaaaaaa站定向到bbbbbbbbbbb站 复制代码代码如下: server { server_naaaaaaame www.aa ...
- Linux中shell基础、重定向、管道符、环境变量
1.什么是shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器).它接收用户输入的命令并把它送入内核去执行.起着协调用户与系统的一致性和在用户与系统之间进行交互的 ...
- Linux中的数据重定向
重定向即指:将数据传送输出到别的地方,如设备.文件等等.那就涉及到将什么数据传送到什么地方的问题. 在linux中命令执行的起源和结果说起,看下图: Standard input和Standard e ...
随机推荐
- 关于C#的async和await
1.async 与 await需要同时出现在方法中 如下图所示 public static async Task b() { await Task.Run(() => { //Thread.S ...
- Anaconda与conda、pip与conda的区别 - 搬运
Anaconda与conda.pip与conda的区别 风影忍着 转自:https://zhuanlan.zhihu.com/p/379321816 作为一个Python初学者,在请教资深 ...
- 循环读取mysql表,合并后去重获取行数
sdt=`date -d"$(date -d'20210108 ' +'%Y%m01')" +"%Y%m%d"`edt=`date -d "$(dat ...
- 有时候用uniapp写项目时发现,Map组件在安卓真机可以缩放和移动,但是在ios真机就不行
如果你的地图组件是放到popup组件里,是用弹框打开的,如何ios端不能缩放, 那你一定要看下这个弹框的层级是否比地图层级要高 z-index. 如果高于地图层级,那地图肯定是不能移动和缩放的
- STM32 系统初始化
#include "system.h" void system_init(void){ //系统中断设置,抢占优先级0~15,无子优先级 NVIC_PriorityGroupCon ...
- vue路由重复跳转导致控制台报错
重复跳转了同一个页面,导致空值台报错了! 解决思路: 方案1:在路由跳转时捕获错误. 1.1 全局捕获处理 //index.js import VueRouter from 'vue-router' ...
- Windows 任务栏透明 居中
任务栏设置 任务栏居中 由于windows默认的程序是从左往右显示,看着可能有一点不舒服,当然如果使用习惯的话,忽然居中,可能更不舒服 首先搜索字符映射表 点击字符映设表中第五行的空白字符,选择进行复 ...
- 用声网 Android UIKit 为实时视频通话应用添加自定义背景丨声网 SDK 教程
使用声网 SDK 和 UIKit 创建视频推流应用非常简单,而且声网还有许多功能,可以提高视频通话的质量和便利性.例如,我们可以在视频通话过程中使用虚拟背景,为视频通话增添趣味性. 我们可以通过以下三 ...
- Java 计算两个日期的时间间隔
@Test public void durationTest(){ Temporal begin = LocalDateTime.of(2000,1,1,0,0); Temporal end = Lo ...
- Kafka + SpringData + (Avro & String) 【Can't convert value of class java.lang.String】问题解决
[1]需求:Kafka 使用 Avero 反序列化时,同时需要对 String 类型的 JSON数据进行反序列化.AvroConfig的配置信息如下: 1 /** 2 * @author zzx 3 ...