프로그램을 호출하기 위해 set --env를 사용하는 이유는 무엇입니까?

프로그램을 호출하기 위해 set --env를 사용하는 이유는 무엇입니까?

Bash 스크립트의 일부 코드는 set -- env앞에 실제 명령을 사용하여 프로그램을 호출하는 것으로 나타났습니다. 예를 들면 다음과 같습니다.

set -- env GOPATH=/some/path go build ${PACKAGE}

이에 대한 근거는 무엇입니까? 이전과 똑같나요?

env GOPATH=/some/path go build ${PACKAGE}

답변1

set -- env GOPATH=/some/path go build ${PACKAGE}

이것은 어떤 프로그램도 호출하지 않습니다(음, 내장된 을 호출 set하지만 env또는 은 호출하지 않음 go). 위치 인수( $1, $2등, 집합적으로 목록이라고 함 "$@")를 다음 단어로 설정하여 if 가 문자열이 되도록 --합니다 .$PACKAGEhello world

$ PACKAGE='hello world'
$ set -- env GOPATH=/some/path go build ${PACKAGE}
$ i=1; for param in "$@"; do printf '$%d = "%s"\n' "$i" "$param"; i=$((i+1)); done
$1 = "env"
$2 = "GOPATH=/some/path"
$3 = "go"
$4 = "build"
$5 = "hello"
$6 = "world"

즉, to를 $1통해 매개변수를 $6이후의 값으로 설정하고 or를 --수행하지 않습니다 .envgo

누군가가 말한다면

"$@"

이것명령이 실행됩니다. "$@"위치 매개변수(별도 참조)로 확장됩니다.

예를 들어 bash, 이는 명명된 배열의 값을 설정하는 것과 동일합니다.

array=( env GOPATH=/some/path go build ${PACKAGE} )

이 또한 수행하지 않습니다 env또는 go.

나중에 사용

"${array[@]}"

명령줄이 실행됩니다.

"$@"및 안의 큰따옴표는 "${array[@]}"의도적이며 중요합니다. 큰따옴표가 없으면 이러한 목록의 요소는 공백으로 된 별도의 단어로 분할되며(위의 문자열이 따옴표 없이 hello world두 개로 분할되는 것처럼 ${PACKAGE}) 쉘은 결과 단어 Wildcard에 파일 이름도 수행합니다.

관련 정보