저는 "Red Hat Enterprise Linux Server 버전 7.1(Maipo)"을 사용하고 있습니다. 비로그인 쉘에 있을 때 쉘 레벨( $SHLVL
)은 2에서 시작하여 연속적인 서브쉘에 따라 증가합니다. 그러나 로그인 쉘을 사용하면 쉘 레벨은 1부터 시작하여 연속적인 서브 쉘로 증가합니다.
질문: 로그인 쉘(1에서 시작)과 비로그인 쉘(2에서 시작) 사이의 최소 쉘 레벨에 차이가 있는 이유는 무엇입니까?
GUI 터미널에서 bash를 사용하고 있습니다.
[aditya@vulcan ~]$ echo $SHLVL
2
[aditya@vulcan ~]$ su -l aditya
Password:
Last login: Fri Jan 12 11:38:56 IST 2018 on :0
[aditya@vulcan ~]$ echo $SHLVL
1
[aditya@vulcan ~]$
답변1
GUI 세션에 로그인하면 세션을 설정하는 스크립트가 비대화형 로그인 셸에서 실행됩니다. , /etc/profile
your 등을 읽고 ~/.[bash_]profile
전체 GUI 세션에 대한 환경을 설정합니다. 그런 다음 쉘은 스크립트를 실행하여 데스크탑 환경을 시작합니다. 효과적으로,저것세션의 셸은 SLVL 1입니다.
X 세션 설정 스크립트는 exec
실제로 데스크탑 환경을 시작하는 마지막 명령일 수 있습니다. 이는 세션의 프로세스 트리 보기에서 쉘 프로세스( )를 찾을 수 없는 이유를 설명합니다 ps xf
. 쉘은 작업을 완료하고 사라졌으며 해당 환경 변수(및 사용자 정의 ulimit와 같은 기타 상속 가능한 설정)만 데스크탑 환경에서 상속됩니다. 모든 하위 프로세스에 전달하는 기본 프로세스입니다. 이렇게 하면 데스크탑 메뉴에서 시작된 프로그램에도 .bash_profile에 설정한 환경 변수가 있으므로 예상대로 작동합니다.
터미널 창은 로그인 셸로 시작하도록 설정할 수도 있으므로 SLVL 1이 됩니다. 적어도 데비안의 KDE는 이런 일을 하는 것 같습니다.
답변2
Bash 매뉴얼 페이지에서:
SLVL은 bash 인스턴스가 시작될 때마다 1씩 증가합니다.
보시다시피 이 변수는 로그인 쉘인지 여부와는 아무런 관련이 없습니다. 이는 귀하의 bash 쉘이 다른 bash 쉘에 의해 시작되었음을 의미합니다. 쉘을 얻기 위해 정확히 무엇을 하는지 모르기 때문에 쉘 호출이 중첩된 이유를 말할 수는 없지만 몇 가지 일반적인 시나리오는 다음과 같습니다.
명령줄에서 새 터미널 창을 시작합니다.
일부 운영 체제 기능을 사용하여 새 터미널 창을 시작하고 있습니다. 이는 먼저 bash를 시작한 다음 터미널을 실행하고 터미널이 새 쉘을 실행함으로써 달성됩니다.
SLVL이 1과 같을 때마다 실행되는 .bash_profile에 재귀 호출이 있습니다
bash
(이상하게 들리지만 두 번 본 적이 있습니다!).