bashrc 스크립트에서 $TERMINFO 변경

bashrc 스크립트에서 $TERMINFO 변경

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

답변2

From man bash- 호출 섹션:

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

환경을 설정하려면 또는 terminfo에 행(및 설정하려는 기타 환경 변수)을 포함하십시오 ..bash_profile.profile

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

답변3

bash는 .bashrc시작할 때만 읽습니다.

source ~/.bashrc따라서 현재 세션에서 다시 로드하려면 다음을 수행해야 합니다 .

관련 정보