我正在尝试获取当前的标准输出重定向,但遇到了一些麻烦。
我有一个始终使用 stdout 重定向运行的脚本,即:
myscript.sh > /tmp/output.log
在 myscript.sh 中,我需要找出它输出到哪个文件。
我目前正在尝试这个(不工作):
logfile=$(readlink -f /proc/self/fd/1)
例如,输出 logfile =/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
关于Linux 文件描述符 - 获取当前重定向标准输出文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40270315/