shell脚本中是否有一种方法可以确定其输出重定向的位置?

时间:2012-04-04 15:15:57

标签: bash shell

我们有以下性质的脚本(在cron中)

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

现在有一种方法可以在someScript.sh中找出输出输入的文件吗?

脚本发送带摘要的电子邮件。同时我想提一下,详细信息可以在输出文件中找到 - 在电子邮件中。

我知道构造if [ -t 1 ]来检测stdout等但是如何获取输出文件名? 请注意,我希望这是通用的,以便某些人可以在cron中更改输出文件,并且不需要修改脚本。

2 个答案:

答案 0 :(得分:9)

我能想到的最简单的事情是:

readlink -f /proc/$$/fd/1

$$是脚本的PID(脚本内部)。在大多数unix系统上,/ proc / [pid]是包含进程[pid]信息的伪目录。

/ proc / [pid] / fd是一个目录,包含进程的打开文件描述符的符号链接列表。 fd / 0是输入,fd / 1是脚本的输出等。

如果不重定向输出,

readlink会为您提供目标文件或tty。

当然,如果你想要显示它,你必须在标准输出以外的地方显示它,否则它将被重定向!要进行调试,请尝试使用std错误(2)。

各种调用会在我的盒子上显示这些结果(script.sh只调用readlink -f / proc / $$ / fd / 1>& 2)

# ./script.sh
/dev/pts/0

# ./script.sh > /var/tmp/foo
/var/tmp/foo

# ./script.sh | more
/proc/12132/fd/pipe:[916212]

答案 1 :(得分:4)

不是试图找到一个黑客(而且太依赖于平台),而是采取稍微不同的方法。

像这样设置你的cron工作:

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log

即。没有和>2>&1(stdout / stderr流重定向)并只传递一个带有所需logfile名称的参数。

现在在someScript.sh中将流重定向到您的日志文件,如下所示:

LOGFILE=$1
exec &>${LOGFILE}

最后,您可以向您的客户发送以下信息:

"output details could be found in ${LOGFILE}"