2012-12-07 2 views
0

bash의 대화식 모드를 사용하여 간단한 터미널 GUI를 구현하려고합니다. 성공적으로 bash를 호출하여 stdout을 얻고 모든 것을 텍스트보기로 인쇄하십시오. 명령을 실행할 수 있으려면 텍스트보기의 사용자 입력을 bash의 stdin으로 전달하십시오. 오류 메시지가 나타나지 않는 것을 제외하고는 훌륭하게 작동합니다.bash가 표준 입력을 stderr로 포워드하지 못하도록하십시오.

그러나 bash의 stderr을 내 텍스트보기로 인쇄 할 때 이상한 것으로 나타났습니다. 지금 오류 메시지를받는 것 외에도 bash는 stdin에서 stderr까지 모든 것을 전달하는 것으로 보입니다. 이 때문에 내가 입력하는 모든 문자는 두 번 인쇄됩니다 (한 번 입력하면 정상적으로 인쇄되고 한 번만 인쇄되므로 stderr).

stderr (bash-3.2$)을 통해 프롬프트가 인쇄 된 것처럼 보입니다. 이것은 예상 된 행동입니까? 이것을 억제 할 수 있습니까?

나는 또한 사용 입력을 캡쳐하고 (사용자가 텍스트보기에 직접 입력하지 않도록) bash를 사용하여 사용자 입력을 인쇄하려고했다. 이 거의 표준 출력표준 에러를 통해 출력의 순서를 제외하고, 노력하는 것은 랜덤 :
이 (두 번째 test가 있습니다 :

나는 가끔이 얻을 입력 echo test 다음과 같은 명령을 입력하고 충돌하는 경우 출력, 내가 testtest)

bash-3.2$ echo testtest 
bash-3.2$ 

를 입력하지 않은 경우에 나는 얻을 :

bash-3.2$ echo test 
bash-3.2$ test 

최종 주문 번호 \n, 출력 및 다음 bash-3.2$은 분명히 섞여 있습니다.

+0

나는 그 대답을 모른다. 그러나 나는 옛날 DOS'@echo off'를 생각 나게한다. – Madbreaks

+0

어떻게 bash를 기동하고 있니? 당신이 실제로 무엇을 구현하는지 모르겠습니다. – Michael

+0

저에게 버퍼링 문제가있는 것 같습니다. bash는 표준 터미널 에뮬레이터의 사용자가 입력 한 내용을 볼 수 있도록 stderr에 stdin echo를 수행합니다. stdout과 stderr에 이상한 버퍼링이 생기므로 bash에서 문자를 읽어들이는 것을 막을 수 있습니다. 하지만 ... 객관적으로는 모르겠다. 그래서 나는 그 이상으로 너를 도울 수 없다. – liori

답변

2

stdout과 stderr을 "올바른"순서로 읽을 방법이 없습니다. 서로 다른 파이프 사이에 순서 개념이 없기 때문입니다. 하지만 둘 다 별도의 파이프로 이동하는 대신 둘 다 동일한 파이프 (즉, 동일한 파일 설명자)로 전송되도록 할 수 있습니다. 그렇게하기 위해 bash 서브 프로세스를 시작하기 위해 사용하는 옵션을 살펴보십시오. 또는 bash -c 'bash 2>&1'과 같은 명령 행을 시작할 수도 있습니다.

+0

왜 이런 생각을하지 않았습니까? ... 고마워요, 이것이 효과가있는 것 같습니다. – DrummerB

관련 문제