${1+"$@"}
tl;dr... 명령줄 인수를 다른 스크립트로 전달하는 스크립트를 찾았습니다. 이것이 정확히 무엇을 하는가? $@
and 대신 언제 사용되나요 "$@"
?
runhaskell
Ubuntu 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)에서 지속되었습니다.
또한보십시오: