더 긴 설명

더 긴 설명

을 실행한 후 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 -aset변수는 다시 포함되지 않습니다. 뭐가 문제 야?

답변1

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

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

귀하의 예는 두 번째 범주에 속합니다. 입력한 내용은 다음과 같습니다.

set -a var=99  

그래서 마지막 주장 var=99설정 중입니다((으) var로 설정되어 있지 않습니다 99). 여튼 _그렇게 정해져있습니다. 보고되는 내용은 다음과 같습니다.

_=var=99  

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

-a이 옵션의 set결과는 다음과 같습니다 .이후에 정의된 모든 변수수출을 기다리고 있습니다.

답변2

_=출력의 줄 시작 부분에 있는 일반 세트는 bash에 _(밑줄)이라는 변수가 있음을 나타냅니다. 그 값은 다음과 같습니다 =. (bash에서) test_var라는 이름의 변수를 설정하는 것과 같습니다 .12345

$ test_var=12345

$ set | grep test_var
test_var=12345

$ declare -p test_var
test_var=12345

이 특수 bash 변수는 이전 줄의 마지막 인수로 설정됩니다.

$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello

$ echo "$_"
_=myvar=hello

$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello

$ declare -p _
declare -- _="_=myvar=hello"

참고하세요 =이 출력에서.


더 긴 설명

을 실행하면 set -a var=99,귀하의 질문과 관련된 다양한 일이 발생합니다.

  1. 변수 내보내기에 대한 옵션( )을 설정합니다 -a(반대 작업 수행).set +a
  2. 위치 매개변수는 옵션 뒤에 오는 항목으로 "설정"됩니다( $1로 설정 var=99).
  3. 쉘 변수 밑줄은 $_마지막 인수(확장)로 설정됩니다.

강모

실행 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

변수 설정=99

실제로 set -- var=99대시()로 시작하는 값이 있는 옵션을 해석하는 것을 피해야 합니다(그리고 그 수가 많습니다) -.

인수 목록(위치 인수 목록)을 로 설정합니다 --. 이는 모든 합리적인 쉘(csh 등 제외)에서 작동합니다. 위치 인수는 "$@"(또는 유사하게 "$*", 같지 않음)로 인쇄됩니다.

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

#_=last_argument 또한 내부 쉘 변수의 값이 _실행된 라인의 마지막 인수로 변경됩니다. 그건아니요이는 bash를 제외한 거의 모든 쉘(jsh, ash, yash, dash, lksh, mksh, ksh93, attsh, 물론 csh 및 tcsh)에 해당됩니다.

$ 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"

답변3

정답은 사용하는 쉘에 따라 다릅니다.

  • ~을 위한bash, @BobEager가 말한 모든 내용이 적용됩니다.
  • ~을 위한zsh, 이전 명령의 마지막 인수로만 설정되며 명령 환경에서 명령의 전체 경로 이름
  • 일부 껍질은 다음과 같습니다dash이 변수는 대화형 세션을 실행할 때만 설정됩니다.

다른 껍질에는 다른 특산품도 있을 수 있습니다. 이렇게, $_한정되지 않은POSIX에서는 사용할 때 잠재적인 이식성 문제를 알고 있어야 합니다.

참고 사항: 값 99를 할당 var하고 후속 하위 프로세스 환경에서 사용할 수 있도록 하려는 경우 이를 달성하기 위한 올바른 구문은 다음과 같습니다.

export var=99

답변4

나는 echo $var아무것도 주어지지 않을 것이라는 것을 알았습니다. … 무슨 일이에요?

덜 작은 글씨로큰 타격(1), 우리는 발견

set[--abefhkmnptuvxBCEHPT] [-o 옵션 이름] [아르기닌…]
set  [+abefhkmnptuvxBCEHPT] [+o 옵션 이름] [아르기닌…]

            ︙
    옵션을 지정하면 쉘 속성을 설정하거나 설정 해제합니다. 옵션 처리 후 남은 인수는 위치 인수의 값으로 처리되어 할당됩니다.$1,$2,…$n

즉, set -a var=99환경 변수를 로 설정 하지 var말고 로 99설정해 보십시오 .$1var=99echo "$1"echo "$*"

관련 정보