Bash 스크립트에서 $READLINE_LINE 및 $READLINE_POINT 값 수정

Bash 스크립트에서 $READLINE_LINE 및 $READLINE_POINT 값 수정

stackoverflow에 이런 질문을 했습니다., 그러나 답변이 없고 댓글도 거의 없습니다. 나는 더 많은 bash 사용자가 있어야 하고 누군가가 이 문제를 우연히 발견했을 수도 있기 때문에 여기에 게시할 것이라고 생각했습니다. ~에 따르면SO 위안, 크로스 사이트 게시물에 링크를 걸어 놓으면 괜찮을 것입니다. 제가 틀렸다면 알려주시면 질문을 삭제하겠습니다.


사용자 정의 스크립트를 key 에 바인딩하여 ksh경로 자동 완성 기능을 사용하여 일부 기능을 구현 하려고 합니다. bash이를 위해 내 스크립트는 bind변수에서 정보를 읽고 $READLINE_LINE$READLINE_POINT을 업데이트하려고 시도합니다. 문제 없이 행 버퍼를 읽을 수는 있지만 이러한 변수를 수정하고 현재 행을 업데이트할 수는 없습니다.

바인딩 매뉴얼 페이지를 인용하면 다음과 같이 작동합니다.

쉘 명령이 실행되면 쉘은 READLINE_LINE 변수를 readline 라인 버퍼의 내용으로 설정하고 READLINE_POINT 변수를 삽입 지점의 현재 위치로 설정합니다. 실행된 명령으로 인해 READLINE_LINE 또는 READLINE_POINT 값이 변경되면 이러한 새 값이 편집 상태에 반영됩니다.

내 스크립트를 와 결합하여 bind -x '"\t":autocomplete.sh'다음과 같은 작업을 수행했습니다.

#!/bin/bash
#autocomplete.sh
echo $READLINE_LINE $READLINE_POINT   #I can read the current line values
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1} #we echo the match if there are more than 1

READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
#echo READLINE_LINE READLINE_POINT echoes the correct values found by magical_autocomplete
#however the current line & the current point is not updated

일부 정보를 에코하면 스크립트 출력을 호출로 리디렉션할 수 $READLINE_LINE없습니다 bind. 변수를 읽을 수는 있지만 쓸 수는 없는 이유는 무엇입니까?

답변1

같은 이유로 이것은 작동하지 않습니다.

$ export a=1
$ bash -c 'echo $a; let a++'
1
$ echo $a
1

환경 변수는유전학, 공유할 수 없습니다. 새 하위 프로세스로 실행 되므로 autocomplete.sh상위 프로세스의 모든 변수를 읽을 수 있지만 새 값을 푸시백할 수는 없습니다.

READLINE_LINE을 수정하려면 READLINE_POINT동일한 프로세스에서 자동 완성을 수행해야 합니다. source이 기능이 도움이 될 것입니다.

# autocomplete.sh
# should be sourced from ~/.bashrc or something

autocomplete() {
    echo $READLINE_LINE $READLINE_POINT
    EXPANSION=($(magical_autocomplete $READLINE_LINE))
    #we store the desired value for the line in ${EXPANSION[0]}
    [[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1}

    READLINE_LINE=${EXPANSION[0]}
    READLINE_POINT=${#READLINE_LINE}
}

묶음:

if [[ -s "$HOME/.bashrc.d/autocomplete.sh" ]]; then
    source "$HOME/.bashrc.d/autocomplete.sh" 
    bind -x '"\t" : autocomplete'
fi

관련 정보