/dev/tty
쓰기를 방지하기 위한 명령줄 옵션이 없는 다음 C 프로그램 예를 생각해 보세요 .
#include <stdio.h>
int main (void) {
FILE* fout = fopen("/dev/tty", "w");
fprintf(fout, "Hello, World!\n");
fclose(fout);
}
출력을 /dev/null
쉘 스크립트로 어떻게 리디렉션할 수 있나요?
PS 나는 읽었다이 답변, 하지만 잘 이해가 안 돼요. 아무튼 프로그램 코드 소스를 수정하지 않는 답변을 찾고 있습니다.
답변1
TL, 박사:
script -c myprogram /dev/null </dev/null >/dev/null
/dev/tty
표준 출력을 리디렉션하는 것과 같은 방식으로 "리디렉션"할 수 없습니다. 표준 출력은 파일 설명자로 정의됩니다. 파일 설명자 1에 이미 열려 있는 모든 파일은 프로그램이 시작될 때 기록됩니다. 일부 운영 체제는 표준 출력과 동등한 파일을 제공 /dev/stdout
하지만 이는 표준 출력의 "별칭"입니다. 대신 /dev/tty
프로세스의 제어 터미널을 나타내는 파일 이름입니다. 프로그램이 열려 있으면 /dev/tty
명시적으로 열리고 /dev/tty
리디렉션될 수 없습니다.
당신이 할 수 있는 일은 실행 중인 프로그램의 제어 터미널이 아닌 다른 제어 터미널을 사용하여 프로그램을 실행하는 것입니다. 이를 수행하는 쉬운 방법은 다음을 사용하는 것입니다.script
주문하다. 가장 간단한 형태:
script -c myprogram /dev/null >/dev/null
실행 myprogram
하고 열면 /dev/tty
이는 script
실행된 터미널이 아니라 제공된 터미널입니다 script
. script
터미널에서 쓰기를 감지하면 자체 표준 출력과 지정된 TypeScript 파일 모두에 쓰는 작업을 수행하므로 script
표준 출력과 TypeScript 파일을 모두 /dev/null
.
myprogram
터미널에서 읽는 경우 자체 표준 입력에서 읽으므로 script
이를 터미널로 리디렉션하는 것이 좋습니다./dev/null
script
종료 상태는 호출자에게 전달되지 않습니다 myprogram
. 데비안 및 그 파생물과 같은 일부 구현에서는 -e
이를 수행하도록 선택할 수 있습니다.
답변2
그것은매우프로그램이 스스로 /dev/tty를 여는 것은 드문 일입니다. 콘솔에 무언가를 인쇄해야 하는 경우 stdout에 쓸 수 있으며 stdout
아래와 같이 리디렉션할 수 있습니다.질 쇼.
여기서 유일한 선택은 가로채는 것입니다도서관 fopen
인라인 처리되거나(흔하지 않은 일임) 기본 운영 체제가 open
이를 호출하여 구부리지 않는 한 호출합니다.
어렵지 않습니다. 해당 함수를 포함하는 작은 라이브러리를 작성해야 합니다 open
. 이 라이브러리는 입력을 "위생 처리"한 후 실제 함수를 호출합니다 open
(즉, 파일 이름이 /dev/tty인 경우 /dev/null로 바꿉니다).
프로그램을 실행하고 시스템 호출을 가로채서 리디렉션합니다.이것이 어떻게 이루어지는지 보여줍니다.