
이것은 내가 작성한 stderr에서 읽은 C 프로그램입니다.
#include <uninstd.h>
#include <stdio.h>
int main(void) {
char buff[3];
read(2, buff, sizeof(buff));
printf("%s", buff");
return 0;
}
내 질문에 stderr을 어떻게 보낼 수 있습니까? 대부분의 검색은 bash 리디렉션과 같이 표시됩니다.
command 2> file
그러나 이것은 stderr을 파일로 보냅니다.
내 프로그램에 어떻게 전달할 수 있나요? 핍처럼,
command 2 "somthing here" ./myprogram
답변해주셔서 감사합니다.
답변1
대부분의 참고서와 문서가 항상 표준 오류를 출력으로 언급한다는 점을 고려하면 많은 사람들에게 놀라운 일입니다.이미 읽기+쓰기용으로 열려 있습니다.. 귀하의 프로그램은 매우~할 수 있다파일 설명자 2에서 읽습니다.
(참고: 이 답변에서는 실제 파일 설명자 번호를 사용하고 있습니다.C 스트림예를 들어 stderr
프로그램이 파일 설명자를 변경할 수 있으므로 실제로 이러한 파일 설명자와 일치할 필요는 없으며 C 스트림이 수행하는 작업에 대해 설명하는 데 혼란이 추가됩니다. 귀하의 프로그램이 을(를) 사용하고 있습니다 read()
.)
파일 설명자 2가 읽기 및 쓰기용으로 열려 있습니다.
상위 프로세스에서 리디렉션이 사용되지 않은 로그인 세션의 프로그램의 경우 파일 설명자 2(표준 오류)는 일반적으로 파일 설명자 0(표준 입력)의 복제본입니다. 둘 다 동일한 기본을 참조합니다.파일 설명, 이는 일반적으로 로그인 세션의 터미널입니다( ttymon
이전 시스템에서는 getty
세션 시작 시 열리고 복제됨).
파일 설명자 2에서 읽는 경우 파일 설명자 0에서 읽은 것과 동일한 입력을 얻습니다.
참고: 파일 설명자 2에서 읽는 것은 비밀번호 입력과 같은 작업을 위해 자주 수행되었습니다. 장치가 소개 되기 전인 /dev/tty
1977년경입니다. 파일 설명자 2에서 읽는 이유는 파일 설명자 0이 다른 곳으로 리디렉션되었을 때(예를 들어 파이프라인 중간의 경우) 원래 터미널에서 입력을 얻기 위한 것이었습니다.
/dev/tty
POSIX는 40년이 넘는 오랜 시간 동안 사용 가능했지만 여전히 파일 설명자 2도 읽기용으로 열려 있어야 합니다 .
귀하의 프로그램이 수행하지 않는 작업
다른 프로그램의 파일 설명자 2 출력을 읽는 것은 다릅니다. 넌 쉽게 그럴 수 없어그 자체로, 표준 출력과 표준 오류를 병합하지 않습니다. 일반적으로 3>&1 1>&2 2>&3
일련의 스왑이 포함됩니다. 몇몇 쉘은 다음을 호출하여 출력 파일 설명자 2에서 파이프를 허용합니다.
prog1 2| prog2
하지만 그런 껍질은 드물고 그게 다가 아닙니다.당신의어떤 경우에도 프로그램이 필요합니다.
프로그램에 입력 보내기
파일 설명자 2에서 읽는 프로그램을 원하는 경우다른물론 터미널에서가 아닌 해당 파일 설명자를 리디렉션합니다. 너~할 수 있었다보통을 사용하다입력리디렉션 구문( <
셸의 연산자)이지만 프로그램의 라이브러리나 다른 곳에서 작성한 다른 코드는 이 파일 설명자에 쓸 수 있다고 가정합니다.
<>
셸을 사용 하면 읽기 및 쓰기용으로 파일을 명시적으로 여는 리디렉션 연산자를 사용할 수 있습니다 . 이는 프로그램의 파일 설명자 2를 리디렉션할 때 사용하는 것입니다.
./myprogram 2<>filename
쉘 리디렉션 외에도 파일 설명자를 조작할 수 있는 도구가 많이 있습니다. 예: Laurent Bercot의 체인 로딩redirfd
execline과 함께 제공되는 도구를 사용하면 이 리디렉션은 다음과 같은 가설과 더 비슷해 보입니다.
redirfd -u 2 filename ./myprogram
파일 설명자 2에 "여기 문서" 및 "여기 문자열"을 제공하기 위한 Bourne Again 및 Z 쉘(Almquist 쉘은 아님)과 같은 쉘 구문도 있습니다. 파일 설명자 2가 열려 있음에 유의하세요.읽기 전용이 경우에는 이 껍질에 의해요.
./myprogram 2<<< "here string"
답변2
stderr
읽기가 아닌 쓰기를 위한 것입니다. 때로는 3개의 입력/출력/오류가 모두 터미널에 연결된 경우와 같은 경우 dup
가 있습니다 . stdin
다른 프로그램의 stderr을 읽으려면 해당 프로그램의 stderr을 다른 프로그램의 stdin으로 리디렉션합니다.
stdout
예를 들어 파일로 지시 하고 stderr
의 ../myprograms
stdin
command 2>&1 >a_file | ./myprogram
답변3
bash
및 zsh
(일반 POSIX는 아님 ) 과 같은 쉘을 사용하면 를 sh
통해 한 프로그램의 표준 오류를 다른 프로그램의 표준 입력으로 리디렉션할 수 있습니다 firstprogram 2> >(second program)
.
예:
$ perl -E 'say "perl stdout"; warn "perl stderr\n"' 2> >(awk '{print "awk", $0}')
perl stdout
awk perl stderr
답변4
셸에서 에 대한 입력 리디렉션을 설정하려면 , 또는 를 stderr
사용 하고 파일 설명자 번호 앞에 접두사를 붙입니다.<
<<
<<<
./myprog 2< somefile.txt
또는
./myprog 2<<< "some text"
하지만 그렇게 리디렉션하면 stderr
프로그램이산출이는 프로그램(또는 프로그램이 사용하는 라이브러리)이 인쇄하려고 시도할 수 있는 오류 메시지를 볼 수 없으며 추가로 프로그램이 해당 메시지를 작성하려고 할 때 오류가 발생함을 의미합니다.
현재 하고 있는 일을 수행하는 다른 방법이 있는지 재고해 볼 수도 있습니다. 최소한, 프로그램에 일부 입력을 제공하려는 아이디어라면 fd 3 사용을 고려하십시오.