bash에서 $_와 $0은 무엇을 의미하나요? [복사]

bash에서 $_와 $0은 무엇을 의미하나요? [복사]

다음 예에서 변수 {_,0}을 이해하는 데 문제가 있습니다.

스크립트에서 tmp.sh:

func() 
{
echo $_
echo $0
echo $1
}

매개변수 x를 사용하여 tmp.sh를 호출합니다.

~$ ./tmp.sh x
./tmp.sh
./tmp.sh
x

그리고 매개변수 x를 사용하여 tmp.sh를 가져옵니다.

~$ . ./tmp.sh x
x
bash
x

내가 이해하는 한 $_, $0첫 번째 예에서 볼 수 있듯이 후자가 첫 번째 매개변수로 사용됩니다 ./tmp.sh. 두 번째 예에서 bash와 동일한 이유는 무엇입니까?

왜 확장하면 .전자는 소스가 없는 bash의 $0에 해당하는 소스 bash의 마지막 인수를 반환합니다. 그렇습니까?

답변1

N이 숫자일 때 참조되는 변수는 $N스크립트에 대한 위치 인수입니다. $0첫 번째 매개변수인 스크립트 자체입니다. $1두 번째 매개변수(bash는 0부터 계산하고 인간은 1부터 계산하기 시작하므로 1로 참조됨)인 x입니다.

$_특정 위치 매개변수가 아니라 실행 중인 명령의 전체 경로로 시작하지만 확장 후 이전 명령의 마지막 매개변수 값이 되는 특수 매개변수이기 때문에 조금 이상합니다. 이것이 첫 번째 실행과 동일한 이유입니다 $0. 반면 두 번째 실행에서는 스크립트를 얻을 때 해당 값 x(소스에서 해석된 이전 명령의 마지막 매개 변수)으로 확장됩니다.

이에 대한 자세한 내용을 보려면 bash 매뉴얼을 읽어보세요.섹션 3.4.1: 위치 매개변수

다음 섹션 3.4.2에는 $_.

답변2

~에서Bash 매뉴얼 페이지 특수 매개변수 섹션:

   0      Expands to the name of the shell or shell script.  This is set at shell initialization.  If bash is invoked with a file of commands, $0 is set to  the
          name  of  that  file.  If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present.
          Otherwise, it is set to the filename used to invoke bash, as given by argument zero.

기본적으로 $0스크립트를 실행하면 스크립트 이름이 제공되고, 대화형 모드에서는 bash가 제공됩니다. .bash는 별칭 이며 실행 파일이 아니라 쉘 내장이므로 $0 값 을 source변경하지 않고 bash를 대화형 모드로 유지합니다.

   _      At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument  list.
          Subsequently,  expands  to the last argument to the previous command, after expansion.  Also set to the full pathname used to invoke each command exe‐
          cuted and placed in the environment exported to that command.  When checking mail, this parameter holds the name of  the  mail  file  currently  being
          checked.

관련 정보