다음 예에서 변수 {_,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
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.