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 中执行。)
我正在尝试获取当前的标准输出重定向,但遇到了一些问题。
我有一个始终 运行 带有标准输出重定向的脚本,即:
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 中执行。)