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
.bashrc
Bash는 시작 시에만 읽습니다.
source ~/.bashrc
따라서 현재 세션에서 다시 로드 해야 합니다 .