삭제 키가 명령줄에서 작동하지 않습니다

삭제 키가 명령줄에서 작동하지 않습니다

**참고: 슈퍼유저에게 동일한 질문을 했지만 답변을 받지 못했습니다. 나는 이제 이것이 이 특정 문제에 대한 더 나은 포럼이라는 것을 깨달았습니다. *

ksh 쉘에서,삭제 키가 제대로 작동하지 않습니다명령줄에서. 삭제 키를 누르면 ~가 표시됩니다.

내가 어떻게 할 수있는:

  1. 바인딩 기능"커서 위치의 문자를 삭제하세요" 키보드 버튼을 삭제하려면? (Control-D는 삭제 버튼이 작동할 것으로 예상한 것처럼 작동했으며 별칭을 사용하려는 시도는 실패했으며 아마도 순진했을 것입니다.)
  2. 바인딩 기능줄의 첫 번째 줄로 이동"홈 키보드 버튼으로? (컨트롤 A는 지금 이 작업을 수행하지만 홈에서 수행하길 원합니다.)
  3. 바인딩 기능줄 끝으로 이동"를 키보드 종료 버튼으로 설정하시겠습니까? (컨트롤 E는 지금 이 작업을 수행하지만 종료하고 싶습니다.)

최종(?) 업데이트

유용한 것을 발견했지만 그 이유를 잘 모르겠습니다. 이것은 작동합니다:

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

~에 따르면http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind,

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.

그래서 나의업데이트된 질문은 왜 이것을 사용해야 합니까 prefix-2?제가 더 이상 이 문제로 모든 사람을 괴롭히지 않도록 제가 이해할 수 있도록 번역해 주세요.

오래된 것들이 따라온다

고쳐 쓰다

QNX의 ESC는 입니다 ^[. 이 명령을 사용하면 bind '^[[3~'='delete-char-backward'커서가 로 커서 아래의 문자를 덮도록 할 수 있습니다 ~. 적어도 어느 정도 진전이 있군요. 이제 철자를 어떻게 쓰는지 알아요키 삭제껍질을 위해. 내가 온라인에서 본 대부분의 내용에는 삭제 키가 이라고 되어 있지만 ^?나에게는 해당되지 않는 것 같습니다. 또한 PuTTy를 통해 액세스하고 있다는 점도 언급해야겠습니다.

이해가 안 돼요 왜냐면컨트롤 D삭제 키로 원하는 작업을 수행합니다. 나는 그것을 다시 바인딩하려고 시도했지만 eot-or-delete성공하지 못했습니다.

이건 간단해야겠죠?

업데이트 2:

 bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2


bind | grep '[^ -~]'
ÿ = prefix-3
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

업데이트 3: 내 설정에 대한 추가 정보

환경설정

 echo $ENV
/etc/kshrc

BIND 완료 출력

bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[  = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

/etc/kshrc

/etc # cat kshrc
case $- in
*i*)
    export SHELL_COLOR_BLUE="print -n \\033[0;34m"
    export SHELL_COLOR_GREEN="print -n \\033[0;32m"
    export SHELL_COLOR_RED="print -n \\033[0;31m"
    export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
    export SHELL_COLOR_YELLOW="print -n \\033[1;33m"

    export COLOR_BLACK="\\033[0;30m"
    export COLOR_BLUE="\\033[0;34m"
    export COLOR_GREEN="\\033[0;32m"
    export COLOR_CYAN="\\033[0;36m"
    export COLOR_RED="\\033[0;31m"
    export COLOR_PURPLE="\\033[0;35m"
    export COLOR_BROWN="\\033[0;33m"
    export COLOR_LIGHTGRAY="\\033[0;37m"
    export COLOR_DARKGRAY="\\033[1;30m"
    export COLOR_LIGHTBLUE="\\033[1;34m"
    export COLOR_LIGHTGREEN="\\033[1;32m"
    export COLOR_LIGHTCYAN="\\033[1;36m"
    export COLOR_LIGHTRED="\\033[1;31m"
    export COLOR_LIGHTPURPLE="\\033[1;35m"
    export COLOR_YELLOW="\\033[1;33m"
    export COLOR_WHITE="\\033[1;37m"

    if [[ `id -u` -eq 0 ]]; then
        export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
    else
        export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
    fi

esac

퍼티 설정:

여기에 이미지 설명을 입력하세요.

댓글은 중요할 수도 있고 중요하지 않을 수도 있지만 맥락을 제공할 수 있습니다.

셸은 "PD KSH v5.2.14 99/07/13.2"입니다. 예, 업그레이드할 수 있는 옵션이 없습니다. 임베디드 시스템입니다. "현대적인 쉘을 구입하세요"는 실행 가능한 대답이 아닙니다. 운영 체제는 QNX Neutrino 6.4.1입니다.

바인딩은 다음을 보여줍니다.

 bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward

infocmp는 다음을 표시합니다.

infocmp  #      Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl, xon,
        cols#80, it#8, lines#65, vt@,
        acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
        hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
        ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
        kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
        kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
        kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
        kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
        kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
        kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
        krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
        ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
        sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
        tbc=\E[3g,

stty는 다음을 표시합니다.

stty Name:  /dev/ttyp0 Type:  pseudo Opens: 2
+edit +echok +echonl
+osflow  intr=^C  quit=^\ erase=^?  kill=^U   eof=^D start=^Q  stop=^S  susp=^Z lnext=^V   min=01  time=00   pr1=^[   pr2=5B  left=44 right=43
up=41  down=42   ins=40   del=50  home=48   end=59

답변1

Google 직원의 경우:

부르다. 쉬워야 할 일이 어렵습니다.

이것짧은 솔루션다음 명령을 사용하여 삭제 키( .kshrc또는 다른 곳) 를 설정합니다.

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

PuTTY 터미널 설정 rxvtStandard.

퍼티 설정

이 작업을 수행하는 데 실제로 도움이 된 것은 다음과 같습니다.http://www.mail-archive.com/[이메일 보호됨]/msg81796.html

ksh는 home 및 end 키를 사용하여 몇 가지 어리석은 작업을 수행합니다. 기본적으로 홈, 종료, 삭제의 차이를 동시에 구분할 수는 없습니다. 세 가지 키는 모두 마지막 바인딩에 관계없이 작동합니다. PuTTY가 이러한 키에 대해 보내는 내용을 변경하면 많은 도움이 됩니다.

참고: 어떤 사람들은 키를 눌렀을 때 쉘이 얻는 코드를 보려면 를 입력하고 catEnter를 누른 다음 해당 키를 누르라고 제안합니다. 내 쉘에서는 이것이 작동하지 않습니다. ~컨트롤 키를 모두 얻었습니다 . 내가 하는 일은 Esc한 번 누른 다음 키를 누르는 것입니다. 그러면 제어 코드가 나타납니다. 이 제어 코드를 사용하면 bind됩니다 .

답변2

쉘이 그놈 터미널 창 내에서 실행 중인 경우을 클릭하면 메뉴가 다음으로 이동합니다. Edit| 프로필을 선택한 다음 탭을 선택하고 로 변경합니다 . (또는 실패하면 다른 옵션을 시도해 보십시오.)PreferencesProfilesCompatibilityDelete key generatesAutomatic


^v Del또는 및 ^v Backspace,(Control-v 다음에 Delete, Control-v 다음에 백스페이스)를 입력하여 반환된 터미널 시퀀스 코드를 찾을 수 있습니다.


확인하려면 다음을 사용하세요.showkey명령은 showkey -sshowkey -k/또는 showkey -a(즉, 3개 레이어)이며 DelBackspace키를 누릅니다.

I) 키보드의 원시 출력
II) tty 드라이버의 출력
III) (ansi) 터미널에 제공된 문자열


이것으로부터 나는 stty(예: stty1)를 사용할 때 내 쉘이 xterm(그래픽 X 터미널 내에서)을 사용할 때와 다르게 동작한다는 것을 알았습니다. Del은 stty1에서 앞으로(오른쪽) 올바르게 삭제하지만 xterm에서는 뒤로(왼쪽) 올바르게 삭제합니다.

답변3

gnome 터미널을 사용하여 Linux (Ubuntu 18.10) bash에서 SSH를 통해 Solaris 11.3 bash까지 기존 두 가지 답변이 작동하지 않았습니다.

해당 명령을 사용해야 한다는 것을 알았지 bind만 기본 기능을 얻을 수 없기 때문에 해결 방법이 있습니다 Delete.

그래서 해결책은 Delete누를 때입니다.시뮬레이션삭제 키를 및 에 매핑하여 삭제합니다 Backspace.

bind '"^[[3~":"^[[C^?"'

이를 입력하려면 다음 키를 사용하십시오.

CTRL-vDelete1부
CTRL-vCTRL-vBackspace2부의 경우.
(또는 \e예를 들어 탈출을 위해 "\e[3~":)

완벽하지는 않습니다. Delete줄 끝에 있으면 여전히 백스페이스로 이동합니다. 하지만 ~이 문자를 하루에도 수없이 백스페이스로 이동 하지 않아도 됩니다 .

답변4

man ksh내 Debian 10 시스템 에 따르면 prefix-1"2문자 명령 시퀀스가 ​​도입되었습니다." 및 prefix-2"다중 문자 명령 시퀀스가 ​​도입되었습니다." 본질적으로 그들은 셸에 "아직 처리하지 마세요. 더 긴 문자 시퀀스가 ​​있어야 합니다. 전체 시퀀스를 기다리세요."라고 말합니다.

최신 Unix/Linux 터미널 세션은 일반적으로 다음에서 실행됩니다.터미널 에뮬레이터: 본질적으로 특정 유형을 시뮬레이션합니다(확장 버전).컴퓨터 터미널직렬 포트를 통해 연결합니다. 많은 터미널의 경우 키보드 키와 컴퓨터로 전송되는 문자 간의 매핑은 엄격히 일대일로 이루어지지 않습니다. 키보드의 모든 다양한 비문자 키에 대해 표준화된 ASCII 제어 문자가 없기 때문에 일부 키는 둘 이상의 키를 전송합니다. 성격 . 문자 순서. 기능 키, 화살표 키, Home, End, Insert, Delete및 이 그룹에 속합니다 PgUp.PgDn

키는 , 즉 + Esc로 표시됩니다 . ASCII 코드 표를 보면 키가 기본적으로 결합된 일반 문자의 값에서 64를 빼는 것(즉, 1비트 뒤집기)을 알 수 있습니다. 특수 이름 "ESC"를 가진 ASCII 제어 문자도 마찬가지입니다 .^[Control[Control^[

출력 에는 및 으로 인식되는 bind | grep prefix것으로 표시됩니다 .^[prefix-1^[[prefix-2

Delete는 실제로 동등한 시퀀스를 보냅니다 Esc [ 3 ~.

따라서 쉘은 다음과 같이 한 번에 한 문자/바이트씩 구문 분석해야 합니다.

  1. 수신됨 Esc: ^["일치" 라고도 prefix-1하므로 최소한 한 문자가 더 나올 때까지 기다렸다가 다음과 결합하세요.
  2. 수신됨 [: 이전 접두 문자와 결합되어 ^[[일치 prefix-2하므로 더 기다렸다가 문자 결합을 계속합니다.
  3. receive 3: 이전 접두사와 결합하면 ^[[3다시 가 되므로 prefix-2계속 기다리고 결합하세요.
  4. 수신됨 ~: 이제 결과 조합이 ^[[3~의 바인딩과 일치합니다 delete-char-forward.

관련 정보