Fir*_*tin 9 shell c io-redirection tty controlling-terminal
考虑这个示例 C 程序,它写入/dev/tty
并且没有命令行选项使其不这样做。
#include <stdio.h>
int main (void) {
FILE* fout = fopen("/dev/tty", "w");
fprintf(fout, "Hello, World!\n");
fclose(fout);
}
Run Code Online (Sandbox Code Playgroud)
如何将它的输出重定向到/dev/null
shell 脚本中?
PS我读了这个答案,但我不太明白。无论如何,我希望得到一个不会修改程序代码源的答案。
Gil*_*il' 16
TL,博士:
script -c myprogram /dev/null </dev/null >/dev/null
Run Code Online (Sandbox Code Playgroud)
您不能像/dev/tty
重定向标准输出那样“重定向” 。标准输出被定义为文件描述符。程序在启动时写入文件描述符 1 上已经打开的任何文件。某些操作系统提供/dev/stdout
的文件相当于标准输出,但它是标准输出的“别名”。相反,/dev/tty
是一个文件名,它指的是进程的控制终端。如果程序打开/dev/tty
,则明确地打开/dev/tty
,并且无法重定向。
您可以做的是使用与运行它的程序的控制终端不同的控制终端来运行该程序。一个简单的方法是使用script
命令. 以其最简单的形式:
script -c myprogram /dev/null >/dev/null
Run Code Online (Sandbox Code Playgroud)
当myprogram
运行并打开时/dev/tty
,这是由 提供script
的终端,而不是script
运行的终端。什么script
当它检测到终端上写是写都以自己的标准输出,并写入到指定的打字稿文件执行; 因此我将script
的标准输出和打字稿文件都设置为/dev/null
.
如果myprogram
从终端script
读取,则从它自己的标准输入读取,因此您可能也希望将其重定向到/dev/null
。
请注意,script
不会将 的退出状态传递myprogram
给其调用者。某些实现(例如 Debian 和衍生版本中的实现)可以-e
选择这样做。