bashrc 스크립트에서 $TERMINFO 변경

bashrc 스크립트에서 $TERMINFO 변경

TERMINFO="$HOME/.terminfo"내 스크립트에서 이것을 설정하려고합니다 .bashrc. 그 이유는 내 터미널이 시스템 terminfo위치에 없기 때문에 terminfo내 홈 디렉터리에 해당 파일이 있기 때문입니다.
여기서 문제는 변경 사항이 현재 셸에는 적용되지 않고 하위 셸에만 적용된다는 것입니다. 나는 이것이 bash가 파일을 읽기 전에 readline이 초기화되기 때문이라고 생각합니다 .bashrc.

그렇다면 이 문제를 해결할 수 있는 방법은 없을까요? 변경 사항을 $TERMINFO적용하기 위해 readline을 다시 초기화하는 방법이 있을까요 ? 설정 후에는 이 작업을
피하려고 합니다. exec bash왜냐하면 재실행 루프에 빠지지 않도록 해야 하기 때문입니다. 이는 추악한 일입니다( exec bash설정 후에 수행하면 작동하지만).

편집 : 이것은아니요스크립트 실행 중 문제가 발생했습니다. .bashrc스크립트가 실행 중이고 $TERMINFO설정 중이 라는 것을 알고 있습니다 . echo $TERMINFO쉘 시작이 완료된 후 실행하면 올바른 값이 표시됩니다.

EDIT2: 이는 bash 또는 readline 라이브러리 버전과 관련이 있는 것 같습니다. bash-4.2.20 및 readline-6.2_p1을 사용하면 문제를 재현할 수 없지만 bash-3.2 및 readline-5.1.3을 사용하면 문제를 재현할 수 있습니다.

그것이 가능하지 않다면 "아니오"가 허용되는 대답입니다. 하지만 무슨 일이 일어나서 대답이 "아니요"가 되었는지 아는 것이 좋을 것입니다.

답변1

그래서 더 깊이 파고들어 무슨 일이 일어나고 있는지 알아냈습니다. RHEL5의 bash 빌드는 terminfo를 전혀 사용하지 않고(왜 Red Hat인지 누가 알겠습니까?) termcap을 사용합니다. 그러나 상자에는 terminfo를 사용하는 또 다른 bash가 있는 것 같습니다. 이것이 기본 bash가 아닌 다른 bash를 사용하기 때문에 서브 쉘과 재실행이 작동하는 이유입니다. 나는 이것을 눈치 채지 못한 것이 어리석은 느낌이 들었습니다.

이는 두 가지 명령을 비교하여 확인할 수 있습니다.

# ldd "$BASH"
    linux-vdso.so.1 =>  (0x00007fff4f1fd000)
    libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003e0bc00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

# ldd `which bash`
    linux-vdso.so.1 =>  (0x00007fff643fd000)
    libncurses.so.5 => /usr/lib64/libncurses.so.5 (0x0000003e0d800000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

하나는 libtermcap과 연결되고 다른 하나는 libncurses와 연결되어 있습니다.

여기서는 RHEL을 사용하고 있음을 지정해야 합니다. 이것이 분명히 핵심 요소이기 때문입니다. 전 세계 거의 모든 사람들이 termcap을 버렸는데 그들이 왜 termcap을 사용하는지는 말이 되지 않지만, 그것이 바로 그 것입니다.

답변2

발신자 man bash- 통화 상대:

bash가 --login 옵션을 사용하여 대화형 로그인 셸 또는 비대화형 셸로 호출되면 먼저 /etc/profile 파일(파일이 있는 경우)에서 명령을 읽고 실행합니다. 파일을 읽은 후 ~/.bash_profile, ~/.bash_login, ~/.profile을 순서대로 찾아 존재하고 읽을 수 있는 첫 번째 파일부터 명령을 읽고 실행합니다.

환경을 설정하려면 terminfo설정하려는 다른 환경 변수와 함께 이 줄을 또는 에 포함하세요..bash_profile.profile

이것 좀 봐자세한 내용은 수퍼유저 답변.

답변3

.bashrcBash는 시작 시에만 읽습니다.

source ~/.bashrc따라서 현재 세션에서 다시 로드 해야 합니다 .

관련 정보