'_'은 언제 환경에서 제거되나요? [복사]

'_'은 언제 환경에서 제거되나요? [복사]
$ bash --norc
$ export | grep '_='
declare -x _="/bin/bash"
$ export | grep '_='
$ 

무슨 일이야 _? 언제 즉시 환경을 종료했습니까?

이것은 내 다른 질문과 관련이 있습니다."`_`를 bash 환경으로 내보낼 수 없는 이유는 무엇입니까?".

답변1

Bash에서는 _명령을 구문 분석할 때마다 마지막 매개변수의 값으로 설정되는 특수 매개변수입니다. 또한 명령이 실행될 때마다 적용되는 내보낼 수 없는 특수 속성도 있습니다(참조:bind_lastargBash 소스 코드에서).

Startup Bash를 사용하면 bash --norc프롬프트에 도달하기 위해 명령을 실행할 필요가 없습니다. 따라서 _환경에 존재하는 경우 덮어쓰지 않습니다. Bash에서 Bash를 시작하면 시작 시 환경에 존재하는 다른 변수와 마찬가지로 상위 Bash가 _시작되기 전에 하위 환경에서 실행될 명령으로 설정되므로 _결국 내보낸 변수가 됩니다. 명령이 실행되지 않았기 때문에 변수는 아직 "내보내기 취소"되지 않았습니다. 이는 첫 번째 항목에 export해당 항목이 포함된 이유를 설명합니다.

export명령( 이 경우 첫 번째 명령) 을 실행하자마자 명령이 _덮어쓰기되고 내보내기 플래그가 손실됩니다. 이것은 두 번째 항목 export이 표시되지 않는 이유를 설명합니다.

(내부적으로 _는 다른 변수와 마찬가지로 변수이므로 읽기 전용으로 만들거나 정수로 표시하여 흥미로운 결과를 얻을 수 있습니다.)

관련 정보