!['_'은 언제 환경에서 제거되나요? [복사]](https://linux55.com/image/131319/'_'%EC%9D%80%20%EC%96%B8%EC%A0%9C%20%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C%20%EC%A0%9C%EA%B1%B0%EB%90%98%EB%82%98%EC%9A%94%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
$ bash --norc
$ export | grep '_='
declare -x _="/bin/bash"
$ export | grep '_='
$
무슨 일이야 _
? 언제 즉시 환경을 종료했습니까?
이것은 내 다른 질문과 관련이 있습니다."`_`를 bash 환경으로 내보낼 수 없는 이유는 무엇입니까?".
답변1
Bash에서는 _
명령을 구문 분석할 때마다 마지막 매개변수의 값으로 설정되는 특수 매개변수입니다. 또한 명령이 실행될 때마다 적용되는 내보낼 수 없는 특수 속성도 있습니다(참조:bind_lastarg
Bash 소스 코드에서).
Startup Bash를 사용하면 bash --norc
프롬프트에 도달하기 위해 명령을 실행할 필요가 없습니다. 따라서 _
환경에 존재하는 경우 덮어쓰지 않습니다. Bash에서 Bash를 시작하면 시작 시 환경에 존재하는 다른 변수와 마찬가지로 상위 Bash가 _
시작되기 전에 하위 환경에서 실행될 명령으로 설정되므로 _
결국 내보낸 변수가 됩니다. 명령이 실행되지 않았기 때문에 변수는 아직 "내보내기 취소"되지 않았습니다. 이는 첫 번째 항목에 export
해당 항목이 포함된 이유를 설명합니다.
export
명령( 이 경우 첫 번째 명령) 을 실행하자마자 명령이 _
덮어쓰기되고 내보내기 플래그가 손실됩니다. 이것은 두 번째 항목 export
이 표시되지 않는 이유를 설명합니다.
(내부적으로 _
는 다른 변수와 마찬가지로 변수이므로 읽기 전용으로 만들거나 정수로 표시하여 흥미로운 결과를 얻을 수 있습니다.)