考虑下面的简单程序,并假设它在一个名为Test.c的文件中.
#include <stdio.h>
int main(){
fprintf(stdout, "Hello stdout\n");
fprintf(stderr, "Hello stderr\n");
}
假设我将该程序编译为一个名为Test的可执行文件,并按如下所示运行它.
./Test > Out 2> Err
运行之后,我将有两个文件Out和Err,分别包含两个消息.
这很妙,因为我通常可以将两种不同类型的消息打印到控制台,然后使用bash重定向过滤其中一个或两个.但是,我只能使用两个文件描述符进行这种过滤的事实似乎非常有局限性.
有什么方法可以打开指向终端输出的第三个或第n个文件描述符,因此我可以对其进行单独过滤?
语法可能是这样的.
./Test > Out 2> Err 3> Err2
我推测由于以下测试,bash可能对此有一些初步的支持,这似乎意味着bash将在&之后加上数字.作为文件描述符.
$./Test >&2
Hello stdout
Hello stderr
$./Test >&3
bash: 3: Bad file descriptor
解决方法:
在shell上运行
exec 3>/dev/tty
…要么…
exec 3>&1
…将打开文件描述符3,将其显式指向您的TTY(在第一种情况下),或指向stdout当前写入的位置(在第二种情况下).
如果要在程序中使用此命令,强烈建议您使用FD数字作为可选参数写入额外的日志:
yourprogram --extra-logs-fd=3
…将该输出与stderr结合起来,或者在没有给出此类选项的情况下完全抑制(视情况而定). (因此,想要额外的日志记录到stdout的用户可以使用–extra-logs-fd = 1或–extra-logs-fd = 2作为stderr).
更好的是,如果您的唯一目标操作系统是Linux,则只需接受要写入的文件名即可:
# to write to a file
yourprogram --extra-logs=extra_logs.txt
# to write to FD 3
yourprogram --extra-logs=/dev/fd/3
# to write to a tee program, then to stderr (in ksh or bash)
yourprogram --extra-logs=>(tee extra_logs.txt >&2)
…当然,您可以使用FD模式进行所有操作(在第一种情况下,只需在外壳中重定向3> extra_logs.txt,在第三种情况下仅重定向3>(tee tee_logs.txt& 2) ),但这使您可以手动管理FD编号,并具有什么优势?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。