プログラムの出力をファイルにリダイレクトすると失敗する

プログラムの出力をファイルにリダイレクトすると失敗する

そこで、foo というプログラムを用意しました。次のコマンドを使用して、その端末出力をファイルにリダイレクトしようとしています。

foo > ./someFile.txt

このコマンドを実行すると、someFile.txt が作成されますが、中身は空です。ターミナル出力をリダイレクトする方法について何かアドバイスはありますか?

答え1

ファイルがsomeFile.txt作成されるというのは予想される動作です。このファイルに何かが含まれているかどうかは、プログラムが何fooをするべきかによって決まります。

どのような問題が発生しても、出力リダイレクトとは関係ないようです。テストとして次のコマンドを試すことができます。

cat > someFile.txt

someFile.txt何か入力してください。入力したものはすべて( ctrl+で終わります)にリダイレクトされますd

ちなみに、出力ファイルはプログラムではなくシェルによって作成されますfoo。存在しないコマンドを入力した場合でも、出力ファイルは作成されます(空です)。

/bin/nonexistent > zzz

答え2

もう 1 つの可能性は、fooを使用しisatty、stdout がインタラクティブな場所を指していない場合は stdout に何も書き込まないことです。

概要

#include <unistd.h>
int isatty(int fd);

説明 isatty() 関数は、fd が端末を参照するオープン ファイル記述子であるかどうかをテストします。

この短い Python プログラムでそれを示します。

import sys, os

if sys.stdout.isatty():
    print "Hello, tty %s" % os.ttyname(1)
else:
    print "stdout: not a typewriter: how boring"

この短い C プログラムも同様です:

#include <stdio.h>
#include <unistd.h>

int main (void) {
    if ( isatty(stdout) ) {
        printf("Hello, tty %s\n", ttyname(1));
    } else {
        printf("stdout: not a typewriter: how boring\n");
    }
    return 0;
}

どちらのプログラムも動作は同じです。

$ ./isatty > notatty ; cat notatty
stdout: not a typewriter: how boring

$ ./isatty.py
Hello, tty /dev/pts/1

$ ./isatty | cat
stdout: not a typewriter: how boring

プログラムは、リダイレクトされているかどうかに基づいて、印刷方法、印刷内容、印刷するかどうかを選択できます。

\e[33;1mこの一般的な用途は、ファイルにテキストの色付けをするために端末 ( など) で読み取られる ANSI エスケープ シーケンスを書き込むことを避けることです。これは見た目が悪く、パーサーを混乱させます。

答え3

私も同じ問題を抱えていました。私のプログラム ログは期待どおりに [stdout] に書き込まれず、[stderr] に書き込まれました。そのため、[stdout] と [stderr] の両方をリダイレクトすることが解決策でした。

foo >> someFile.txt 2>&1

関連情報