shell交换stdout stderr
比如这个脚本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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现