터미널 프로그램을 통해 키 입력 전송을 어떻게 시뮬레이션할 수 있나요?

터미널 프로그램을 통해 키 입력 전송을 어떻게 시뮬레이션할 수 있나요?

가상으로 터미널 프로그램에 키 입력을 보내야 합니다(예:또는이맥스).

나는 이런 일을하고 싶다 :

echo -e 'iHello, world!\e' | vi

그럼 거기에다음 버퍼로 세션을 엽니다.

Hello, world!
~
~
~
~
~

하지만 이건 작동하지 않아키 입력을 읽을 수 없음표준 입력.

다음 오류가 발생합니다.

ex/vi: Vi's standard input and output must be a terminal

키보드에서 직접 입력한 것처럼 일부 텍스트 문자열을 터미널 프로그램으로 보내려면 어떻게 해야 합니까?

답변1

이것은 일반적으로expect그것은:

expect -c 'spawn -noecho vi; send "iHello World!\r\33"; interact'

대중화되기 expectperl이나 이전에 TCL용으로 작성 되었지만 현재 유사한 모듈python~을 위한perl또는python도 가능.

또 다른 옵션은 tty 장치에 ioctl을 실행하여 TIOCSTI입력 대기열에 문자를 삽입하는 것입니다(한 번에 1바이트).

perl -le 'require "sys/ioctl.ph";
          ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
         ' $'iHello World!\r\e'; vi

이는 터미널 에뮬레이터와 애플리케이션(여기서 vi) 사이에 추가 의사 터미널 계층을 방지할 수 있다는 장점이 있습니다.

답변2

@Stéphane Chazelas의 Perl 예제를 기반으로 스크립트나 명령줄을 통해 다음을 사용할 수 있습니다.

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo; _app_

최종 포기하면산출지침입력 대기열(커널에서는 이를 호출함), 현재 콘솔 셸 또는 shell명령줄을 편집하는 응용 프로그램에 표시됩니다. stty화면의 모든 (전이중) 에코를 중지합니다 .

노트:기술적으로 이것은 명시적으로 "아날로그 키 누르기"가 아닙니다.

관련 정보