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

Sig*_*mun 16 bash stdout stderr

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

你有个主意吗?

$*bash的变量不给我这个信息.

je4*_*e4d 26

从技术上讲,没有办法告诉stdin/stdout/stderr是否被"重定向",因为你不知道调用你的脚本是什么.如果没有从另一个shell调用它,则没有"重定向"的概念.

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

如果要查找重定向到的进程的位置/内容,请检查符号链接的目标/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
Run Code Online (Sandbox Code Playgroud)

[ -t 1 ] 第1和第4会是如此.

  • 这是一个丰富的答案,让我了解一些bash的东西.谢谢 ! (2认同)

Mat*_*Mat 23

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

if [ -t 1 ] ; then
  echo stdout is a terminal
else
  echo stdout is not a terminal
fi
Run Code Online (Sandbox Code Playgroud)

使用-t 0stdin.

使用-t 2stderr.