29、Linux标准输出、标准错误输出、覆盖、追加重定向详解

1、标准输出重定向

1>     覆盖重定向,目标文件中原有的内容会被清除;
1>>    追加重定向,新内容会被追加至目标文件的尾部;

有时候覆盖重定向比较危险,在bash中,使用set -C 来关闭覆盖重定向, 如果想要恢复,使用set +C来恢复
有时候在默认不允许覆盖重定向,但是我又知道我在干什么硬要覆盖,我们可以使用>| 来强制性覆盖,这样可以无视set -C的设置


对于标准输出而言,假设我使用cat /etc/passwd 1> 1.txt    由于cat /etc/passwd 这个命令会被正确执行,所以会把执行命令返回的结果覆盖到1.txt文件中
而如果我故意将命令写错,写成cat /etc/passwdd 1> 1.txt   由于文件压根就不存在,而对于1>而言,它只会把正确的命令输出结果追加到文件中,如果命令错误,则不会,因此1.txt此时是空的

2、标准错误输出重定向

2>   错误覆盖重定向,如果目标文件原本有内容将会被覆盖,并且会把错误的数据追到的目标文件中
2>>  错误追加重定向,把错误的数据流追加到目标文件行尾处

假设我使用cat /etc/passwd 2> 1.txt,由于该命令能够被正常执行,但是由于2>只能将终端错误的提示覆盖到1.txt中,但由于现在命令被正确的执行了,所以1.txt的文件是空的

而如果我使用 cat /etc/passwdd 2> 1.txt,由于压根就没有这个文件,因此在正常情况下,终端会提示没有这个文件或目录
但由于我们这里使用的是2>,因此屏幕上不会有任何输出,而是把原本应该输出到屏幕上的提示给给覆盖到了1.txt中了,因此1.txt里面的内容变成了cat: /etc/passwddd: 没有那个文件或目录

3、标准输出到追加到一个文件里,标准错误输出追加到另外一个文件里

cat /etc/passwd 1>> biaozhun.txt 2>> cuowu.txt

这个如果执行正确了,会被追加到biaozhun.txt中,如果命令执行失败来,则会将错误提示追加到cuowu.txt中
 
但是这样的结果就是,在执行完命令之后,只会有一个文件里内容,但两个文件都会被创建出来

4、标准输出与标准错误输出都追加重定向到某一个文件中

在实际的使用过程中,我不想分这么细,我就想把标准输出和标准错误输出都追加到指定的一个文件中去方便我查看,特别是在运行一个jar包服务的时候

cat /etc/passwd >> output.txt 2>&1

首先,标准输出 1 被重定向到 output.txt 文件并追加内容。
然后,标准错误 2 被重定向到标准输出 1 所指向的地方,即 output.txt 文件。
& 是一个特殊符号,用于指定文件描述符而不是文件名,所以这里1代表的是标准输出的文件描述符
所以 2>&1 的含义是将标准错误重定向到标准输出的文件描述符,而不是某个文件。


问:为什么这里不能使用2>>&1
答:其实不管咋样,我们在第一步的时候已经指定了追加覆盖重定向了,因为我们使用的是cat /etc/passwd >> output.txt  然后我们这里又使用了2>&1,说白了就是把标准错误输出重定向的内容丢给1
让1再重新追加到文件到文件里,自然就实现来2>>的效果,当然在实际情况中是不允许使用2>>&1的,这是一个语法错误

5、所以我们在日常运行java服务的时候,也会将标准输出和标准错误输出都追到到一个文件中来方便我们查看

java -jar app.jar >> spring.log 2>&1

6、对于Bash 4版本以上的,如果我们嫌标准输出与错误输出2>&1这样写麻烦,还可以用&>>来表示,它们是等价的

简化语法(Bash 4 及以上)
java -jar app.jar &>> spring.log &



传统语法(所有 Bash 版本)
java -jar app.jar >> spring.log 2>&1 &

7、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值