Linux 文件描述符 - 获取当前重定向标准输出文件?

Linux file descriptor - getting current redirection stdout file?

我正在尝试获取当前的标准输出重定向,但遇到了一些问题。

我有一个始终 运行 带有标准输出重定向的脚本,即:

myscript.sh > /tmp/output.log

在myscript.sh中,我需要找出输出到哪个文件。

我目前正在尝试这个(不工作):

logfile=$(readlink -f /proc/self/fd/1)

例如,输出日志文件 = /tmp/sflq.r3f。我需要改为发现它会 /tmp/output.log

这可能吗?

如果重要的话,我正在使用 korn shell...

谢谢!

$() 使用管道(或 ksh 出现的样子——ksh 似乎用来模拟其他 shell 中通常是管道的临时文件)来捕获 readlink 的输出。

$() 内部,stdout 是那个管道(或者在 ksh 的情况下是临时文件)。

你可以绕过这个插入的标准输出文件,比如:

{ logfile=$(readlink -f /proc/self/fd/3); }  3>&1
# my ksh 93 needs the { ;} -- dash, and zsh don't 
echo "The logfile is: $logfile"

现在:

./myscript.sh > /tmp/output.log
echo OUTPUT.LOG
cat /tmp/output.log

应该给你:

OUTPUT.LOG
The logfile is: /tmp/output.log

另一种选择是想办法完全避免变量:

echo -n "The logfile is: "
readlink -f /proc/self/fd/1 #goes straight to stdout so no need to capture

伙计们,你们似乎非常关注/proc/*self*/fd。一定要考虑这个 self 在你的代码调用的上下文中到底意味着什么,如果在脚本的主体中使用类似 /proc/$$/fd 的东西不是一个更好的主意......

(提示:$(readlink …) 在子 shell 中执行。)