
그래서 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