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

标签 linux file ksh descriptor

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

我有一个始终使用 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/

相关文章:

Linux 脚本 - 抑制日期时间中的单引号

linux - 通过 ssh : how to redirect stdin 启动的 c++ 进程的 gdb 远程调试

linux - 逐行读取模式之间的内容,然后以限定格式打印

c++ - pthread cancel 成功但在几百个线程后无法创建线程

java - 从文本文件中删除一个单词

c++ - 读取 'Extended' 文件属性 (C++)

c - 无论 C 中的名称如何,都打开一个 .dat 文件

linux - 递归重命名所有子目录中的 .jpg 文件

linux - 获取 Red Hat Linux 的 CD-R 的 SCSI id

linux - 在脚本中使用 uname -n 与 VAR=$(uname -n) 的优点/缺点?