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

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

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

foo > ./someFile.txt

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

답변1

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

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

cat > someFile.txt

무엇이든 입력하세요. 입력한 모든 항목은 ( someFile.txt+로 끝나는) 로 리디렉션됩니다 .ctrld

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

/bin/nonexistent > zzz

답변2

또 다른 가능성은 대화형 어딘가를 가리키지 않는 경우 foostdout에 아무것도 사용하고 쓰지 않는 것 입니다.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

관련 정보