Shell

如何將 C 程序的輸出從 /dev/tty 重定向到 /dev/null?

  • May 4, 2021

考慮這個範例 C 程序,它寫入/dev/tty並且沒有命令行選項使其不這樣做。

#include <stdio.h>

int main (void) {
   FILE* fout = fopen("/dev/tty", "w");
   fprintf(fout, "Hello, World!\n");
   fclose(fout);
}

如何將它的輸出重定向到/dev/nullshell 腳本中?

PS我讀了這個答案,但我不太了解。無論如何,我期待一個不會修改程式碼源的答案。

長話短說:

script -c myprogram /dev/null </dev/null >/dev/null

您不能像/dev/tty重定向標準輸出一樣“重定向”。標準輸出定義為文件描述符。程序在啟動時寫入文件描述符 1 上已經打開的任何文件。一些作業系統提供/dev/stdout的文件相當於標準輸出,但它是標準輸出的“別名”。相反,/dev/tty是一個文件名,它指的是程序的控制終端。如果一個程序打開/dev/tty,它會顯式打開/dev/tty,並且無法重定向。

您可以做的是使用與執行它的程序的控制終端不同的控制終端執行程序。一個簡單的方法是使用script命令。最簡單的形式:

script -c myprogram /dev/null >/dev/null

myprogram執行和打開時/dev/tty,這是由 提供的script終端,而不是script執行的終端。當script它檢測到終端上的寫入時,它會同時寫入自己的標準輸出並寫入指定的打字稿文件;因此我將script的標準輸出和打字稿文件都設置為/dev/null.

如果myprogram從終端script讀取,則從其自己的標準輸入讀取,因此您可能也希望將其重定向到/dev/null

請注意,script不會將退出狀態傳遞myprogram給其呼叫者。一些實現(例如 Debian 及其衍生版本中的實現)可以-e選擇這樣做。

引用自:https://unix.stackexchange.com/questions/647843