![출력이 파일로 리디렉션되는지 어떻게 알 수 있나요? [복사]](https://linux55.com/image/72198/%EC%B6%9C%EB%A0%A5%EC%9D%B4%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%EB%90%98%EB%8A%94%EC%A7%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%95%8C%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
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");
}