返回

shell交换stdout stderr

发布时间:2022-10-19 02:01:05 199
# 脚本

比如这个脚本myscript.sh:

#!/bin/sh

echo "I'm stdout";
echo "I'm stderr" >&2;

交换它的stdout和stderr可以这样做:

(sh myscript.sh 3>&2 2>&1 1>&3-) 2>/dev/null
(sh myscript.sh 3>&2 2>&1 1>&3-) >/dev/null
I'm stderr
I'm stdout

​3>&2​​​表示将文件描述符2复制为文件描述符3(不是dup,tee才用的dup)。
​​​2>&1​​​表示把文件描述符1(stdout)复制为文件描述符2(stderr)。现在进程写入2(stderr)时,我们就能在1(stdout)收到了。
​​​1>&3-​​​表示把文件描述符3​​移动​​到文件描述符1,移动完了之后3就被关掉了。所以现在的1存的是原来的2,现在的2存的是原来1。

命令里的小括号的作用是新开一个shell,防止重定向乱掉。如果不用小括号,比如​​3>&2 2>&1 1>&3- > /dev/null​​​,​​> /dev/null​​就会把现在的1给重定向掉,而现在的1其实是原先的stderr了。

原文:​​https://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderr​​

参考文献
​​​shell中各种括号的作用()、(())、[]、[[]]、{}​​

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线