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


10

Bash Manual은 다음과 같이 말합니다 (맨 페이지, 강조).

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

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

_

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

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

    $ bash
    $ export | grep '_=' 

    매뉴얼에 따르면 _, 새로운 bash 쉘의 환경 변수 여야합니다. export새로운 bash 쉘의 모든 환경 변수를 출력해야하지만 출력하지는 않습니다 _. 그래서 _새로운 bash 쉘의 환경 변수 인지 궁금합니다 .

  2. 실제로 모든 bash 쉘에서 동일한 일이 발생합니다.

    $ export | grep '_='

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

  3. 비교하려고:

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

내 게시물은 Mike의 의견Stephane의 답변 에서 영감을 얻었습니다 .


1
쉘 변수이며 명령 환경으로 전달됩니다 . 반드시 환경으로 내보내지는 것은 아닙니다 . export는 기본 제공이지만을 사용 하는 경우이 시스템 printenv _에서 호출 방법을 보여줍니다 /usr/bin/printenv.
Toby Speight

참고 bash -c export | grep _=(배쉬에서) 부모 쉘이 호출하는 방법을 보여 bash비록, 명령은 $_부모에 해제합니다.
Toby Speight

답변:


13

예, _새로운 Bash 쉘의 환경 변수입니다. 당신은 그것을 실행하여 볼 수 있습니다

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

쉘 내부 : 쉘의 초기 환경 내용을 보여줍니다. 시작하기 전에 이전 셸을 설정하지 않았기 때문에 첫 번째 셸에서 볼 수 없습니다.

$_Bash 내부 확장 은 _특수 매개 변수를 나타내며,이 매개 변수는 이전 명령의 마지막 인수로 확장됩니다. (내부적으로 배쉬는 사용하여이 작업을 처리하는 _명령 구문 분석 될 때마다 업데이트됩니다 쉘 변수를하지만 정말 구현 세부입니다. 그것은 명령을 구문 분석 할 때마다 "안 export"입니다. ) export표시되지 않습니다 _이 없기 때문에 내 보낸 것으로 표시된 변수; 그러나의 출력에서 ​​볼 수 있습니다 set.

첫 번째 예에서는 새로운 배쉬 쉘 구문 분석의 시작 파일의 명령을 실행, 그래서 실행할 때 explore | grep '-=', _이미 덮어 쓴 및 수출하지으로 표시.

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


감사. 새로운 bash 쉘에서 왜 export | grep '_='아무것도 출력 하지 않습니까? 원래 bash 쉘에서 왜 tr '\0' '\n' < /proc/$$/environ | grep _=아무것도 출력 하지 않습니까?
Tim


9

export인수 없이는 내 보낸 모든 변수를 나열합니다 . _변수가 아니지만 특수 매개 변수 로 나열됩니다 .

혼동스럽게도 다른 특수 매개 변수의 이름과 달리 변수의 유효한 이름_ 일 수도 있습니다 . 적어도 Bash 4.4는 불만없이 할당 할 수 있습니다. 특수 효과가 즉시 값을 무시하기 때문에 유용하지 않습니다.


2
_;-) 변수 로 사용하려고 재미있게 보내십시오 . 효과적으로 쓰기 전용이며 값이 즉시 손실됩니다.
Stephen Kitt

1
또한 내부적으로 Bash는 _변수로 취급하므로이 변수가의 출력에 나타납니다 set. 그러나 내가 결정할 수있는 한 수출 된 것으로 표시 할 수 없습니다.
Stephen Kitt

2
@StephenKitt이지만 Bash 4.4에서는 읽기 전용으로 표시 할 수 있습니다. 또는 정수. 다소 재미있는 결과.
ilkkachu

1
하, 좋은 발견, 오히려 재미 있어요!
Stephen Kitt

5

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

자식 프로세스 환경에이 변수를 자동으로 추가 하지만 셸에있는 값과는 다른 값을 갖기 때문에 내 보낸 bash것으로 표시 하는 것은 의미가 없습니다 (현재).$_

내 보낸 것으로 표시하면 외부 명령 환경에서 발생할 일에 대해 사용자에게 혼란을 줄 수 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.