그래서 나는 프로그램을 가지고 있습니다. 그것을 foo라고 부르겠습니다. 다음 명령을 사용하여 터미널 출력을 파일로 리디렉션하려고 합니다.
foo > ./someFile.txt
이제 명령을 실행하면 someFile.txt가 생성되지만 비어 있습니다. 터미널 출력을 리디렉션하는 방법에 대한 제안 사항이 있습니까?
답변1
someFile.txt
파일이 생성되는 것은 예상되는 동작입니다. 이 파일에 어떤 내용이 포함되어 있는지 여부는 foo
프로그램이 수행할 작업 에 따라 다릅니다 .
어떤 문제가 발생하든 출력 리디렉션과 관련이 없는 것 같습니다. 다음 명령을 테스트해 볼 수 있습니다.
cat > someFile.txt
무엇이든 입력하세요. 입력한 모든 항목은 ( someFile.txt
+로 끝나는) 로 리디렉션됩니다 .ctrld
그런데 출력 파일은 프로그램이 아닌 쉘에 의해 생성됩니다 foo
. 존재하지 않는 명령을 입력하더라도 출력 파일은 계속 생성됩니다(비어 있음).
/bin/nonexistent > zzz
답변2
또 다른 가능성은 대화형 어딘가를 가리키지 않는 경우 foo
stdout에 아무것도 사용하고 쓰지 않는 것 입니다.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