首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在bash脚本中测试stdout和stderr重定向

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

Stack Overflow用户
提问于 2012-02-18 17:40:51
回答 2查看 5.6K关注 0票数 18

我想在我的bash脚本中测试stdout和stderr被定向到哪里,或者更准确地说,测试它们是否被重定向。

你有主意吗?

$* bash变量不会给我提供此信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 25
EN

Stack Overflow用户

发布于 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 ]是正确的。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9340129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档