대부분의 메이크파일에는 이런 이상한 기호 세트가 있습니다 '${1+"$@"}'
. $@는 makefile 대상 파일 이름입니다. 그런데 왜 사람들은 이처럼 복잡한 기호를 사용하려고 할까요 '${1+"$@"}'
?
답변1
목적은 ${1+"$@"}
휴대성입니다.
POSIX에서 정의한 $@위치 매개변수가 없으면 null로 확장됩니다. 그러나 원래 Bourne 쉘( /bin/sh
Solaris 10 및 이전 버전)은 이를 빈 문자열로 확장합니다 ""
. if 가 설정된 경우에만 확장되므로 를 사용하는 것이 ${1+"$@"}
이 문제에 대한 해결책입니다 ."$@"
$1
불행하게도 이 구성은 3.x 및 4.3 이전의 zsh 버전에서는 작동하지 않습니다.분사를 실행하다${1+"$@"}
sh 에뮬레이션 모드(나뉘다설정되었습니다):
$ set -- '1 2'
$ for i in ${1+"$@"}; do echo $i; done
1
2
"$@"
올바르게 처리됨:
$ set -- '1 2'
$ for i in "$@"; do echo $i; done
1 2
따라서 alias -g '${1+"$@"}'='"$@"'
사용시 단어 분리가 수행되지 않도록 하십시오 ${1+"$@"}
. 이전 확장 ${1+"$@"}
으로 대체되므로 zsh에서 구성을 사용할 수 있습니다 "$@"
(앞이나 뒤의 단어 문자가 아닌 문자열 전체를 사용해야 함 ${1+"$@"}
).
"$@"
당신이 할 수 있는 또 다른 일은 다음을 확인하여 위치 인수가 없는 경우 사용을 완전히 무시하는 것입니다 $#
.
case $# in
(0) func ;;
(*) func "$@" ;;
esac
더 많은 작업이 필요하지만 완전히 이식 가능합니다.