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

在bash脚本中测试stdout和stderr重定向,bash,stdout,stderr,Bash,Stdout,Stderr,我想在我的bash脚本中测试stdout和stderr被重定向的位置,或者更准确地说,如果它们被重定向的话 你有主意吗 $*bash变量没有提供此信息 您应该能够使用-t测试开关来判断输出流是否为ttys: if [ -t 1 ] ; then echo stdout is a terminal else echo stdout is not a terminal fi 对于stdin,使用-t0 使用-t2作为stderr技术上无法判断stdin/stdout/stderr是否被“重

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

你有主意吗


$*
bash变量没有提供此信息

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

if [ -t 1 ] ; then
  echo stdout is a terminal
else
  echo stdout is not a terminal
fi
对于
stdin
,使用
-t0


使用
-t2
作为
stderr

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

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

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

[-t1]
对于其中的第一个和第四个是正确的。

这是一个丰富的答案,可以让我理解一些bash的东西。谢谢谢谢!我做了一个命令行测试,但出乎意料的是,它没有起作用。此命令:
(lsof-p$$;ls-l/proc/$$/fd;[-t1]| echo-n NOT\;echo TERM:$$;ps--forest-s$$)| cat-
为fd1打印
/dev/pts/1
,但打印
非TERM
。所以知道它被重定向(
(…)
在子脚本中运行),但是$$仍然是父脚本的PID。是的,$$就是这样做的,子脚本不会影响它。这就是为什么我改用bash-c“…”的原因。