프로그램 출력을 파일로 리디렉션하지 못했습니다.

프로그램 출력을 파일로 리디렉션하지 못했습니다.

그래서 foo라고 부르는 프로그램이 있습니다. 다음 명령을 사용하여 터미널 출력을 파일로 리디렉션하려고 합니다.

foo > ./someFile.txt

이제 해당 명령을 실행하면 someFile.txt가 생성되지만 비어 있습니다. 터미널 출력을 리디렉션하는 방법에 대한 제안 사항이 있습니까?

답변1

파일이 someFile.txt생성되는 것은 예상되는 동작입니다. 이 파일에 내용이 포함되어 있는지 여부는 프로그램이 foo수행할 작업에 따라 다릅니다.

어떤 문제가 발생하더라도 출력 리디렉션과 관련이 없는 것 같습니다. 테스트로 다음 명령을 시도해 볼 수 있습니다.

cat > someFile.txt

아무거나 입력하세요. 무엇을 입력하든 리디렉션됩니다 ( + someFile.txt로 끝남 ).ctrld

그런데 출력 파일은 프로그램이 아닌 쉘에 의해 생성됩니다 foo. 존재하지 않는 명령을 입력하더라도 출력 파일은 계속 생성됩니다(비어 있음).

/bin/nonexistent > zzz

답변2

또 다른 가능성은 stdout이 대화형 어딘가를 가리키지 않는 경우 stdout에 아무 것도 foo사용 isatty하고 쓰지 않는다는 것입니다.

개요

#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

관련 정보