我想在我的bash脚本中测试stdout和stderr被定向到哪里,或者更准确地说,测试它们是否被重定向。
你有主意吗?
$*
bash变量不会给我提供此信息。
发布于 2012-02-18 17:47:07
您应该能够使用-t
测试开关来判断输出流是否为tty
:
if [ -t 1 ] ; then
echo stdout is a terminal
else
echo stdout is not a terminal
fi
对stdin
使用-t 0
。
对stderr
使用-t 2
。
发布于 2012-02-18 21:14:28
从技术上讲,无法判断stdin/stdout/stderr是否被“重定向”,因为您不知道是什么在调用您的脚本。如果它不是从另一个shell调用的,就没有“重定向”的概念。
您所要做的就是输入/输出/错误文件描述符的类型(terminal、fifo、pipe、device、file等)。通常,您只想检测您的输出是否会到达某个用户的屏幕,或者是否会到达另一个进程。在这种情况下,请按照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 ]
是正确的。
https://stackoverflow.com/questions/9340129
复制相似问题