“_ =”의 의미는 무엇입니까?


29

을 실행하면 set -a var=99다음 출력에서 ​​문장을 찾을 수 있습니다 set.

...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...

누구든지 "_ ="의 의미를 말해 줄 수 있습니까?

나는 그것이 echo $var아무 것도주지 않을 것입니다. 나는를 실행하면 set -a, 다음은 set다시이 변수를 포함하지 않습니다. 무슨 일이야?


답변:


16

를 실행 set -a var=99하면 세 가지 별개의 일이 발생합니다 (질문과 관련됨).

  1. vars를 내보내기 위한 설정 옵션 ( -a) (을 수행 set +a하여 반대 ).
  2. 위치 매개 변수는 옵션 다음에 따라 $1설정됩니다 (로 설정 var=99).
  3. 쉘 변수 밑줄 $_은 마지막 매개 변수 (확장)로 설정됩니다.

설정 -a

의 실행 set -a마크 모든 후속 (신규 또는 변경) (제외한 모든 쉘에서 수출로 변수 csh와 어떤 관련 껍질).

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

이 설정에서 복구하려면 다음 -을로 변경하십시오 +.

$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

var = 99로 설정

실제로 set -- var=99대시 ( -)로 시작하는 값으로 옵션 (및 세트가 많음)의 해석을 피해야 합니다.

인수 목록 (위치 매개 변수 목록)을 이후의 목록으로 설정합니다 --. 이것은 모든 합리적인 쉘에서 유효합니다 (csh 등은 아님). 위치 인수는 "$ @"(또는 유사한 "$ *", 같지 않음)으로 인쇄됩니다.

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

_ = 마지막 인수

그리고 내부 쉘 변수의 값은 _실행 된 행의 마지막 인수로 변경됩니다. 즉 NOT 거의 모든 쉘에서 (JSH, 화산재, YASH, 대시, lksh, mksh, 경우 ksh93, attsh 및 코스 CSH와 tcsh에서의) bash는 제외하고 사실.

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

의 값이 있습니다 $_확장 후 값이 :

$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

이것이 당신이 실행할 때의 이유입니다.

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

쉘 변수 '$ _'에 대한 설명을 얻습니다. 이것은 또한 작동합니다 :

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"

37

밑줄은 실제로 특수 쉘 변수입니다. 여기 _에 표시되는 값은 밑줄 ( ) 변수입니다 var=99. 읽기 전용이며 셸에서 유지 관리합니다. 그것은:

  • 인수 목록에 전달 된대로 실행중인 쉘 또는 스크립트의 절대 파일 이름을 포함하는 쉘 시작시 설정하십시오.
  • 그 후, 확장 후 이전 명령에 대한 마지막 인수로 확장됩니다.
  • 메일을 확인할 때이 매개 변수는 메일 파일의 이름을 보유합니다.
  • 또한 실행되어 해당 명령으로 내 보낸 환경에 배치 된 각 명령의 전체 경로 이름으로 설정됩니다.

귀하의 예는 두 번째 범주에 속합니다. 입력 한 내용 :

set -a var=99  

마지막 인수 그래서이 있었다 var=99, 그리고 그것은이었다 가치 당신이 (당신이 설정되지 않은 설정되었다 var99). 따라서, 그렇게 _설정되었습니다. 그리고 그것이보고되고 있습니다 :

_=var=99  

약간 혼란 스럽지만 첫 번째 =는 변수에 대한 할당을 나타내고 _두 번째는 값의 일부입니다.

또한 이후에 정의 된 모든 변수 를 내보내 도록하는 -a옵션 도 언급 할 가치 set가 있습니다 .


16

정답은 사용중인 쉘에 따라 다릅니다.

  • for bash@BobEager가 적용한 모든 내용
  • for zsh에 대해서는 이전 명령의 마지막 인수 및 명령 환경에서 명령의 전체 경로 이름으로 만 설정됩니다.
  • dash대화식 세션을 실행할 때만이 변수를 설정하는 것과 같은 일부 쉘

다른 껍질에도 다른 특수성이있을 수 있습니다. 이와 같이 $_되어 정의되지 를 사용하는 경우 하나의 잠재적 이식성 문제 알고 있어야하므로, POSIX에.

참고 : 99의 값을 할당하여 var후속 서브 프로세스 환경에서 사용할 수 있도록하려면 올바른 구문은 다음과 같습니다.

export var=99

2
올바른 구문은 unset var;set -a; var=99입니다. 모든 공명 쉘에서 작동합니다 (csh 등은 아님).
Arrow

1
의 마지막 줄에 따라 있지만 @Arrow 밥 열망의 대답 이 만들 것 모두 당신이 원하는하지 않을 수 있습니다 이후 수출 수정 / 설정 변수를.
TripeHound

8

그리고 나는 echo $var아무것도주지 않을 것입니다. … 무슨 일이야?

bash (1) 의 그리 정밀하지 않은 인쇄 에서 우리는

set[ --abefhkmnptuvxBCEHPT] [ option-name ] [ arg …]   [ ] [ option-name ] [ arg …]-o
set+abefhkmnptuvxBCEHPT+o

            options
    옵션이 지정되면 쉘 속성을 설정하거나 설정 해제합니다. 옵션 처리 후에 남아있는 인자에 순서대로 위치 매개 변수에 대한 값으로 취급되며, 할당 $1, $2... .$n

즉, set -a var=99환경 변수 var99;로 설정하지 않습니다 . 로 설정 $1됩니다 var=99. 시도 echo "$1"또는 echo "$*"당신은 볼 수 있습니다.

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