Java로 터미널 에뮬레이터를 구현하려고합니다. Windows에서 cmd.exe를 호스트 할 수 있어야하고 유닉스 계열 시스템에서 bash를 사용할 수 있어야합니다 (적어도 Linux 및 Mac OS X를 지원하고 싶습니다). 내가 가진 문제는 cmd.exe
과 bash
이 모두 표준 입력으로 보내는 표준 출력에서 반복된다는 것입니다.터미널 에뮬레이터 구현 - 반복 입력시 문제가 발생했습니다.
예를 들어, bash에서 "ls
"을 입력하고 Enter 키를 누르면 터미널 에뮬레이터가 입력 라인을 bash의 stdin으로 보내고 스트림을 플러시합니다. 그런 다음 입력 라인을 "ls\n
"으로 다시 출력 한 다음 ls
명령의 출력을 출력합니다.
bash
및 cmd.exe
이외의 다른 프로그램이이를 수행하지 않기 때문에이 문제가 발생합니다. bash 또는 cmd.exe
명령에서 "python -i
"명령을 실행하면 파이썬 대화 형 쉘은 bash
및 cmd.exe
과 같은 방식으로 입력을 반복하지 않습니다. 즉, 해결 방법은 실제 출력이 어느 프로세스에서 왔는지를 알아야한다는 것입니다. 나는 그것이 실제 터미널 에뮬레이터가하는 일이라고 생각하지 않습니다.
"bash -i
"을 실행해도이 동작이 변경되지 않습니다. 내가 아는 한, cmd.exe
에는 별개의 "대화 형"및 "비대화 형"모드가 없습니다.
편집 : 나는 ProcessBuilder
클래스를 사용하여 호스트 프로세스를 생성하고. stdout과 stderr를 읽고, stream gobbler과 비슷한 기술을 사용하여 프로세스의 표준 입력을 작성합니다. 호스트 프로세스를 시작하기 전에 환경 변수를 설정하지 않습니다. 프로세스를 시작하는 데 사용하는 정확한 명령은 bash의 경우 bash -i
이고 cmd.exe의 경우 cmd
입니다. 내가 관리 할 수있게되면 최소한의 코드 예제를 게시하려고 노력할 것이다.
이것은 'bash'와 관련이있는 것으로 보입니다 : 사용자 입력을 숨 깁니다. http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/ 이것이 얼마나 이식성이 있는지 모르겠습니다. – Piskvor
재밌 네요,'echo ls | bash는 그렇게 아무것도하지 않는다. –
사실, 터미널 에뮬레이터 내에서 실행하더라도. 나는 입력이 파이프에서 온다는 것을 알고 bash와 관련이 있다고 생각합니다. – Honza