bash 쉘에서 `_`는 언제 환경 변수입니까?

bash 쉘에서 `_`는 언제 환경 변수입니까?

Bash 매뉴얼은 다음과 같이 말합니다(man 페이지, 강조):

Bash가 외부 명령을 호출하면 이 변수는 $_명령의 전체 경로 이름으로 설정됩니다.해당 환경의 명령으로 전달됩니다.

그리고(특수 매개변수):

_

( $_, 밑줄.) 쉘이 시작되면 환경 또는 인수 목록에 전달된 쉘을 호출하는 데 사용되는 절대 경로 이름 또는 실행 중인 쉘 스크립트로 설정하십시오. 그런 다음 확장 후 이전 명령의 마지막 인수로 확장됩니다. 또한 실행된 각 명령을 호출하고 해당 명령으로 내보낸 환경에 배치하는 데 사용되는 전체 경로 이름으로 설정됩니다. 메일을 확인할 때 이 매개변수는 메일 파일의 이름을 보유합니다.

  1. Bash 쉘에서 다음을 실행합니다.

    $ bash
    $ export | grep '_=' 
    

    매뉴얼에 따르면 _새로운 bash 쉘의 환경 변수여야 합니다. export새로운 bash 쉘의 환경 변수를 모두 출력해야 하는데 그렇지 않습니다 . 그러면 그것이 새로운 bash 쉘의 환경 변수인지 _알고 싶습니다 ._

  2. 실제로 어떤 bash 쉘에서도 같은 일이 발생합니다

    $ export | grep '_='
    

    아무것도 출력하지 않습니다. _bash 쉘에 환경 변수가 있는지 궁금합니다 .

  3. 비교하려고:

    $ dash
    $ export  | grep '_='        
    export _='/bin/dash'
    

내 게시물은 다음에서 영감을 얻었습니다.마이크의 코멘트그리고스티븐의 대답.

답변1

예, _새로운 Bash 셸을 위한 환경 변수입니다. 다음을 실행하면 볼 수 있습니다.

tr '\0' '\n' < /proc/$$/environ | grep _=

inside the shell: 쉘의 초기 환경 내용을 표시합니다. 시작하기 전에 설정할 이전 셸이 없기 때문에 첫 번째 셸에서는 표시되지 않습니다.

Bash 내 확장은 이전 명령의 마지막 인수로 확장되는 특수 인수를 $_나타냅니다 . (Bash는 명령이 구문 분석될 때마다 업데이트되는 쉘 변수를 _사용하여 _이를 내부적으로 처리 하지만 이는 실제로 구현 세부 사항입니다.명령이 구문 분석될 때마다 "내보낼 수 없음"이 나옵니다.)은 내보내기용으로 표시된 변수가 아니기 때문에 export표시되지 않습니다 _. 그러나 의 출력에서는 볼 수 있습니다 set.

첫 번째 예에서 새로운 Bash 셸은 시작 파일의 명령을 구문 분석하고 실행하므로 run 을 실행하면 export | grep '_='해당 _명령을 덮어쓰고 내보내지 않은 것으로 표시합니다.

예제 에서는 dash시작 파일을 실행하지 않는 것 같으므로 변수를 Bash가 실행하기 전에 설정하는 환경 변수로 취급하고 있습니다 dash.

답변2

export인수 없이 모든 내보내기 나열변하기 쉬운. _변수는 아니지만 다음과 같이 나열됩니다.특수 매개변수.

좀 헷갈릴 _수도 있겠네요유효한 변수 이름, 이는 다른 특수 매개변수의 이름과 다릅니다. 최소한 Bash 4.4에서는 불만 없이 할당이 가능합니다. 특수 효과가 값을 즉시 덮어쓰기 때문에 작동하지 않습니다.

답변3

의 출력에서 ​​볼 수 있듯이 모든 셸 변수가 내보내기용으로 표시되는 것은 아닙니다 declare -p.

bash$_내보내기로 표시하는 것은 이 변수를 하위 프로세스의 환경에 자동으로 추가하므로 의미가 없습니다.하지만그 값은 (당시) 쉘의 값과 다릅니다.

이를 내보내기로 표시하면 외부 명령 환경에서 어떤 일이 발생할지 사용자에게 혼란을 줄 뿐입니다.

모든 "런타임 변수"는 BASH*내보내지지 않습니다.

관련 정보