如何实现shell脚本中标准输出和标准错误流的交换?
- 内容介绍
- 文章标签
- 相关推荐
本文共计529个文字,预计阅读时间需要3分钟。
假设需要改写的原创新内容如下:
bash#!/bin/bash这是一个用于测试的脚本
定义一个变量name=Alice
打印变量echo Hello, $name!
进行一些计算sum=$(($name + 2))
打印计算结果echo The sum is: $sum
简化改写后的内容:
bash#!/bin/bash
变量name=Alice
打印问候echo Hello, $name!
计算并输出echo Sum is: $(($name + 2))
比如这个脚本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了。
原文:stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderr
参考文献
shell中各种括号的作用()、(())、[]、[[]]、{}
本文共计529个文字,预计阅读时间需要3分钟。
假设需要改写的原创新内容如下:
bash#!/bin/bash这是一个用于测试的脚本
定义一个变量name=Alice
打印变量echo Hello, $name!
进行一些计算sum=$(($name + 2))
打印计算结果echo The sum is: $sum
简化改写后的内容:
bash#!/bin/bash
变量name=Alice
打印问候echo Hello, $name!
计算并输出echo Sum is: $(($name + 2))
比如这个脚本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了。
原文:stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderr
参考文献
shell中各种括号的作用()、(())、[]、[[]]、{}

