Bash에서 $@, "$@" 및 ${1+"$@"}를 사용하는 경우

Bash에서 $@, "$@" 및 ${1+"$@"}를 사용하는 경우

${1+"$@"}tl;dr... 명령줄 인수를 다른 스크립트로 전달하는 스크립트를 찾았습니다. 이것이 정확히 무엇을 하는가? $@and 대신 언제 사용되나요 "$@"?

runhaskellUbuntu 15.10(및 기타 버전)에는 ghc와 함께 배포되는 간단한 쉘 스크립트가 있습니다 . 어떻게 하면 Cabal 샌드박스를 인식하는 것으로 교체할 수 있을지 고민 중입니다. 쉘 스크립트는 다음과 같습니다. 사용되지 않는 변수와 불필요한 shebang과 같은 주석이 있는 것 같습니다(이전 버전의 스크립트에서?).

#!/bin/bash
exedir="/usr/lib/ghc/bin"
exeprog="runghc"
executablename="$exedir/$exeprog"
datadir="/usr/share"
bindir="/usr/bin"
topdir="/usr/lib/ghc"
#!/bin/sh

exec "$executablename" -f "$bindir/ghc" ${1+"$@"}

마지막 줄을 이해할 수 없습니다. 분명히 위임하는 기본 실행 파일 /usr/lib/ghc/bin/runghc이며 runhaskell전달되는 인수 중 하나는 컴파일러의 위치입니다. 알았어, 문제없어.

어떤 기능을 ${1+"$@"}하며 언제 사용해야 합니까? 내 추측으로는 이것이 1항상 성공하는 테스트일 뿐이며 이 구성은 문자 그대로 인수를 전달하는 데 사용된다는 것입니다. POSIX에서 이를 요구 $@하고 "$@"예상과 다르게 동작한다는 것을 기억 하지만 정확한 세부 사항은 기억나지 않습니다.

답변1

${var+foo}foo변수가 설정되면 var(비어 있더라도) 다른 것으로 확장됩니다. 이 경우 변수는 첫 번째 위치 인수입니다 $1. 따라서 설정되어 있는지 ${1+"$@"}확인 하고 그에 따라 확장하면 됩니다 .$1"$@"

위치 인수로 확장한 후 필드 분할 및 파일 이름 확장의 영향을 받는 $@및 의 경우 대신 다음 "$@"을 수행합니다 .$@"$@"

$ sh -c 'cd /usr; printf "%s\n" $@' _ 'a b' '*'  
a
b
bin
include
$ sh -c 'cd /usr; printf "%s\n" "$@"' _ 'a b' '*'
a b
*

당신은 거의 항상 "$@"over 를 사용하고 싶어합니다 $@.

${1+"$@"}vs just 의 경우 "$@"POSIX 호환 셸에서 둘 다 동일한 효과를 갖습니다. ~에 따르면이 스택 오버플로 게시물:

"히스테리성 건포도", 일명 역사적 이유.

약 20년 전, Bourne Shell의 일부 깨진 작은 변형은 아무것도 대체하지 않는 현재의 올바른 동작 대신 no 인수를 빈 문자열로 대체했습니다 "". "$@"그러한 시스템이 여전히 사용되고 있는지 여부는 논쟁의 여지가 있습니다.

이것autoconf 매뉴얼 섹션쉘 대안또한 이것과 관련이 있습니다:

특정 확장에는 이식성 문제도 있습니다.

$@

가장 잘 알려진 쉘 이식성 문제 중 하나 "$@"는 " "입니다. 위치 인수가 없을 때 Posix는 ' "$@"'는 아무것도 아닌 것과 같아야 한다고 말했지만 원래 Unix 버전 7 Bourne 쉘은 이를 ' ""'와 동등한 것으로 취급했으며 이 동작은 이후 구현(예: Digital Unix 5.0)에서 지속되었습니다.


또한보십시오:

관련 정보