2009-11-26 4 views
3

나는 bash로 표준 입력을 통해 화살표 키를 보내려고합니다 :화살표 키를 표준 입력으로

cat |/빈/bash

그럼 "에코 안녕하세요"= "안녕하세요"콘솔 (물론 따옴표없이)에 나타납니다 그럼 화살표 키를 누르십시오 =>^[[명령을 찾을 수 없습니다 나타납니다

stdin을 통해 프로그램에 화살표 키를 보낼 수 있습니까?

내가 묻는 이유는 다음과 같습니다. 다른 프로그램에서 배시를 제어하려고합니다. bash에 화살표 키를 보내고 싶습니다

+0

왜 화살표 키를 bash로 보내시겠습니까? 어떤 문제를 해결하려고합니까? –

+0

웹 인터페이스를 통해 bash를 제어하려고합니다. 따라서 나는 bash에 그러한 키를 보낼 수 있어야한다 (vi에서 열기와 편집). – user219704

+0

그 예일뿐입니다. 그러나 vi에서 화살표 키를 사용할 필요는 없습니다. 그게 내가, j, k, 그리고 내가 원하는거야. –

답변

0

-i 스위치로 bash를 시작하십시오.

5

실제로해야 할 일은 pseudo-tty 장치 (openpty() 또는 그 유사)를 만들고 해당 PTY에 bash을 시작한 다음 해당 PTY 장치를 통해 키 획을 보냅니다. GNU C 라이브러리 매뉴얼의 the section on “Pseudo-Terminals”을 참조하십시오.

+0

네, 그 다음에 화살표 키의 ASCII 값을 포함하는 네 개의 문자를 만들고 을 사용하여 pty의 마스터 측에 쓰십시오. "(MasterPTY_FD, CharContainingSomeArrowKey, sizeof (CharContainingSomeArrowKey)"char에 할당 할 16 진 코드 위쪽 화살표는 0x18, 아래쪽 : 0x19, 왼쪽 : 0x1B, 오른쪽 : 0x1A –

0

cat을 사용하지 마십시오. readline 지원을 활성화하려면 Bash 내장 read 명령을 -e 옵션과 함께 사용하십시오.

# version 1 
while IFS="" read -r -e -d $'\n' line; do printf '%s\n' "$line"; done | /bin/bash 

# version 2 
#set -o pipefail 
# kill 0: kill process group 
(
while IFS="" read -r -e -d $'\n' line; do 
    #trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill $PPID' EXIT HUP INT QUIT PIPE TERM ERR 
    trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill 0' EXIT HUP INT QUIT PIPE TERM ERR 
    printf '%s\n' "$line" >> ~/.bash_history 
    history -n 
    printf '%s\n' "$line" 
done 
) | (trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill 0' EXIT HUP INT QUIT PIPE TERM ERR; /bin/bash) 
#) | (trap 'trap - EXIT HUP INT QUIT PIPE TERM ERR; kill $PPID' EXIT HUP INT QUIT PIPE TERM ERR; /bin/bash) 
관련 문제