SHLVL 과 BASHSUBSHELL 두 변수의 차이

3112 단어
SHLVL 은 여러 Bash 프로 세 스 인 스 턴 스 의 깊이 를 기록 하 는 누산기 입 니 다. BASH_SUBSHELL 은 Bash 프로 세 스 인 스 턴 스 의 여러 키 Shell (subshell) 내장 깊이 를 기록 하 는 누적 기 입 니 다.
위의 이 말 을 이해 할 수 없 으 니 괜찮아, 내 가 임시로 지 어 낸 것 이 니까.사실 네가 이 두 변 수 를 헷 갈 리 게 한다 면, 나 는 네가 대부분 옳다 고 생각한다. BASH_SUBSHELL 이라는 변수 이름 의 subshell 개념 이 명확 하지 않 습 니 다. 다음은 subshell 이 무엇 인지, 무엇이 아 닌 지 말씀 드 리 겠 습 니 다.
많은 사람들 이 Bash 에서 Bash 를 한 번 더 실행 하거나 Shell 스 크 립 트 를 하나 더 실행 하면 하위 Shell 에 들 어 가 는 것 이 라 고 착각 하기 때문에 다음 과 같은 의문 이 있 을 것 이다.
$bash\# 다른 bash 명령 실행 $echo $BASHSUBSHELL  $ 0\# 왜 0 이 야, 나 는 지난 Shell 의 하위 Shell 에 있 지 않 니? $echo ' echo $BASH_SUBSHELL ' > test; chmod +x test; ./test; $ 0\# Shell 스 크 립 트 를 다시 실행 해도 하위 Shell 이 아 닙 니까?
그러나 이것 은 모두 하위 셸 이 아 닙 니 다. 이러한 상황 은 '현재 셸 이 외부 명령 을 시 작 했 는데 이 외부 명령 은 셸 입 니 다' 라 고 만 설명 할 수 있 습 니 다. 진정한 하위 셸 은 하 드 디스크 의 외부 명령 을 다시 실행 할 필요 가 없습니다. 모두 메모리 의 작업 입 니 다.위 예제 의 BASHSUBSHELL 은 모두 SHLVL 로 교체 해 야 누적 효 과 를 볼 수 있다.
몇 권 의 책 이 하위 셸 에 게 정 의 를 내 린 적 이 있다.
Advanced Bash-Scripting Guide 말:
A subshell is a child process launched by a shell (or shell script).
Bash Cookbook 말:
A subshell is a forked copy of the parent shell and shares it’s environment.
The Korn Shell: Unix & Linux Programming Manual 말:
A subshell is a separate copy of the parent shell, so variables, functions, and aliases from the parent shell are available to the subshell
첫 번 째 책 은 널리 퍼 졌 지만 이 말 은 너무 광범 위 해서 사람 을 오도 하기 쉽다. 비록 하위 셸 은 현재 셸 의 하위 프로 세 스 이지 만 현재 셸 의 하위 프로 세 스 가 모두 하위 셸 (다른 프로그램 으로 바 뀌 었 을 수도 있다) 은 아니다.Bash 에서 특정한 문법 만 코드 를 하위 Shell 에 들 어가 게 할 수 있 습 니 다. 예 를 들 어 파이프 양쪽 의 명령, 예 를 들 어 작은 괄호 로 묶 는 등 입 니 다.
$ (echo $BASH_SUBSHELL) 1 $ ( ( ( ( (echo $BASH_SUBSHELL) ) ) ) ) 5
진정한 하위 셸 은 부모 셸 의 모든 변 수 를 방문 할 수 있 으 며, bash 명령 을 한 번 더 실행 하면 시 작 된 셸 은 부모 셸 에서 들 려 오 는 환경 변 수 를 방문 할 수 있 습 니 다.이 강좌 에는 전문 적 으로 예 를 하나 썼 다.
For an example of the difference between a subshell and a child process that happens to be a shell:
unset a; a=1
(echo "a is $a in the subshell") sh -c 'echo "a is $a in the child shell"'

In the subshell, the regular shell variable a is visible; but because it is not exported, the full child process does not see it.
위의 예 에서 현재 Shell 이 외부 명령 을 수행 하 는 sh 가 시작 하 는 Shell 을 child shell 이 라 고 하 는데, 안 타 깝 게 도 중국어 에 서 는 하위 Shell 로 번역 해 야 합 니 다.
c 언어 차원 에서 볼 때 진정한 하위 셸 은 현재 셸 프로 세 스 가 fork () 함 수 를 호출 하여 메모리 에서 거의 똑 같은 하위 프로 세 스 를 복사 합 니 다.한편, bash 명령 을 실행 하 는 이른바 child shell 은 fork () 함 수 를 실행 하 는 토대 에서 execve () 함 수 를 한 번 더 실 행 했 습 니 다. execve () 함 수 는 하 드 디스크 의 bash 명령 을 다시 불 러 오고 실 행 됩 니 다. 방금 fork 에서 나 온 셸 프로 세 스 를 교체 합 니 다. 들 어 오 는 환경 변 수 를 제외 하고 새로운 프로 세 스 입 니 다.
요약 하면, SHLVL 변 수 는 이른바 child shell 의 내장 깊이 를 기록 한 것 이다. BASH_SUBSHELL 은 subshell 의 내장 깊이 를 기록 한 것 입 니 다.
child shell 을 자 Shell 이 라 고 부 르 는 것 은 말로 만 해도 괜 찮 습 니 다. 왜냐하면 중국어 에 다른 좋 은 명칭 이 없 기 때 문 입 니 다. 그러나 이것 은 용어 자 Shell 의 진정한 의미 가 아니 라 는 것 을 알 아야 합 니 다.
여기까지 쓰 고 나 는 이 글 의 제목 을 '자 셸 이 무엇 인지' 로 바 꿔 야 한다 고 생각한다.

좋은 웹페이지 즐겨찾기