$SLVL이 비로그인 셸에서는 레벨 2에서 시작되지만 RHEL 7의 로그인 셸에서는 레벨 1에서 시작되는 이유는 무엇입니까?

$SLVL이 비로그인 셸에서는 레벨 2에서 시작되지만 RHEL 7의 로그인 셸에서는 레벨 1에서 시작되는 이유는 무엇입니까?

저는 "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/profileyour 등을 읽고 ~/.[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(이상하게 들리지만 두 번 본 적이 있습니다!).

관련 정보