在bash脚本中测试stdout和stderr重定向

时间:2012-02-18 09:40:51

标签: bash stdout stderr

我想在我的bash脚本中测试stdout和stderr的定向,或者更确切地说,如果它们已被重定向。

你有个主意吗?

$* bash变量不会给我这个信息。

2 个答案:

答案 0 :(得分:26)

从技术上讲,无法判断stdin / stdout / stderr是否被“重定向”,因为你不知道是什么在调用你的脚本。如果没有从另一个shell调用它,则没有“重定向”的概念。

你需要做的就是输入/输出/错误文件描述符的类型(终端,fifo,管道,设备,文件等)。通常,您只想检测输出是否进入某个用户的屏幕,或者是否进入另一个进程。在这种情况下,根据Mat的回答使用[ -t 1 ]

如果您想了解流程重定向到的位置/内容,请检查符号链接/proc/$$/fd/1/proc/$$/fd/2的目标。

请注意,有人可以将您的流程输出连接到./myscript.sh > /dev/pts/1234的其他终端。然后它将被“重定向”,但是stdout仍然是一个终端。

示例:

$ ls -l /proc/$$/fd/1 > results
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0
$ cat results 
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798]
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0

[ -t 1 ]对于第1和第4个都是如此。

答案 1 :(得分:22)

您应该能够使用-t测试开关判断输出流是否为tty

if [ -t 1 ] ; then
  echo stdout is a terminal
else
  echo stdout is not a terminal
fi

-t 0使用stdin

-t 2使用stderr