가상으로 터미널 프로그램에 키 입력을 보내야 합니다(예:육또는이맥스).
나는 이런 일을하고 싶다 :
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'
대중화되기 expect
전 perl
이나 이전에 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
화면의 모든 (전이중) 에코를 중지합니다 .
노트:기술적으로 이것은 명시적으로 "아날로그 키 누르기"가 아닙니다.