출력이 파일로 리디렉션되는지 어떻게 알 수 있나요? [복사]

출력이 파일로 리디렉션되는지 어떻게 알 수 있나요? [복사]

ls명령과 같은 출력을 표시하는 데 어려움을 겪고 있습니다 (ls만 있고 옵션 없음). 시스템 호출을 사용하는 작업자 프로그램이 있습니다. 그런데 테스트를 하던 중 아래와 같이 이상한 현상이 발생했습니다.

$ ls 
a b c
$ ls > somefile
$ cat somefile
a
b
c

따라서 보시다시피 LS에 대한 추가 스위치 없이 출력은 작성된 파일당 하나의 파일입니다. 테스트할 수 있습니다. 따라서 위의 내용을 ls통해 리디렉션을 통해 파일에 쓰는 경우 명령에 한 줄에 하나씩 표시하는 내장 논리가 있다는 것을 추론했습니다.

문제를 더 혼란스럽게 만들기 위해 쉘이 리디렉션을 해석한다고 생각합니다.

그래서 혼란스럽고 파일로 리디렉션되는 경우 출력이 한 줄에 하나씩 정확히 생성되는 이유가 무엇인지 궁금합니다. 어떤 팁이 있나요?

답변1

일반적으로 문제의 파일 핸들이 tty에 연결되어 있는지 테스트합니다.

% perl -le 'print -t STDOUT ? "yes" : "no"'
yes
% perl -le 'print -t STDOUT ? "yes" : "no"' > out
% < out
no
% 

또는 C를 통해 다음과 같이 할 수 있습니다.

#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

...

int foo;
if (ioctl(STDIN_FILENO, FIONREAD, &foo) == -1) {
    printf("yes\n");
} else {
    printf("no\n");
}

관련 정보