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 가 문자열이 되도록 --
합니다 .$PACKAGE
hello 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를 --
수행하지 않습니다 .env
go
누군가가 말한다면
"$@"
이것명령이 실행됩니다. "$@"
위치 매개변수(별도 참조)로 확장됩니다.
예를 들어 bash
, 이는 명명된 배열의 값을 설정하는 것과 동일합니다.
array=( env GOPATH=/some/path go build ${PACKAGE} )
이 또한 수행하지 않습니다 env
또는 go
.
나중에 사용
"${array[@]}"
명령줄이 실행됩니다.
"$@"
및 안의 큰따옴표는 "${array[@]}"
의도적이며 중요합니다. 큰따옴표가 없으면 이러한 목록의 요소는 공백으로 된 별도의 단어로 분할되며(위의 문자열이 따옴표 없이 hello world
두 개로 분할되는 것처럼 ${PACKAGE}
) 쉘은 결과 단어 Wildcard에 파일 이름도 수행합니다.