2012-01-13 6 views
1

Java로 터미널 에뮬레이터를 구현하려고합니다. Windows에서 cmd.exe를 호스트 할 수 있어야하고 유닉스 계열 시스템에서 bash를 사용할 수 있어야합니다 (적어도 Linux 및 Mac OS X를 지원하고 싶습니다). 내가 가진 문제는 cmd.exebash이 모두 표준 입력으로 보내는 표준 출력에서 ​​반복된다는 것입니다.터미널 에뮬레이터 구현 - 반복 입력시 문제가 발생했습니다.

예를 들어, bash에서 "ls"을 입력하고 Enter 키를 누르면 터미널 에뮬레이터가 입력 라인을 bash의 stdin으로 보내고 스트림을 플러시합니다. 그런 다음 입력 라인을 "ls\n"으로 다시 출력 한 다음 ls 명령의 출력을 출력합니다.

bashcmd.exe 이외의 다른 프로그램이이를 수행하지 않기 때문에이 문제가 발생합니다. bash 또는 cmd.exe 명령에서 "python -i"명령을 실행하면 파이썬 대화 형 쉘은 bashcmd.exe과 같은 방식으로 입력을 반복하지 않습니다. 즉, 해결 방법은 실제 출력이 어느 프로세스에서 왔는지를 알아야한다는 것입니다. 나는 그것이 실제 터미널 에뮬레이터가하는 일이라고 생각하지 않습니다.

"bash -i"을 실행해도이 동작이 변경되지 않습니다. 내가 아는 한, cmd.exe에는 별개의 "대화 형"및 "비대화 형"모드가 없습니다.


편집 : 나는 ProcessBuilder 클래스를 사용하여 호스트 프로세스를 생성하고. stdout과 stderr를 읽고, stream gobbler과 비슷한 기술을 사용하여 프로세스의 표준 입력을 작성합니다. 호스트 프로세스를 시작하기 전에 환경 변수를 설정하지 않습니다. 프로세스를 시작하는 데 사용하는 정확한 명령은 bash의 경우 bash -i이고 cmd.exe의 경우 cmd입니다. 내가 관리 할 수있게되면 최소한의 코드 예제를 게시하려고 노력할 것이다.

+0

이것은 'bash'와 관련이있는 것으로 보입니다 : 사용자 입력을 숨 깁니다. http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/ 이것이 얼마나 이식성이 있는지 모르겠습니다. – Piskvor

+2

재밌 네요,'echo ls | bash는 그렇게 아무것도하지 않는다. –

+0

사실, 터미널 에뮬레이터 내에서 실행하더라도. 나는 입력이 파이프에서 온다는 것을 알고 bash와 관련이 있다고 생각합니다. – Honza

답변

4

유닉스에서는 stty -echo을 실행하여 "로컬 에코"(즉, 입력 한 모든 것을 반복하는 쉘)를 사용하지 않도록 설정하십시오. 이것은 대개 사용자가 입력 한 내용을 편집 할 수 있도록 활성화됩니다.

귀하의 경우, BASH는 어쨌든 의사 TTY를 할당해야합니다. 그렇지 않으면 모든 명령을 표시하지 않습니다. set +x과 비슷한 효과가 있지만 출력에 ls 대신 + ls이 표시됩니다.

cmd.exe으로 @ECHO OFF 명령은 동일한 효과를 가져야합니다.

프로세스를 만든 후에 작업을 수행하면 제대로 작동합니다.