alias -g '${1+"$@"}'='"$@"', 무슨 일을 하나요?

alias -g '${1+"$@"}'='"$@"', 무슨 일을 하나요?

대부분의 메이크파일에는 이런 이상한 기호 세트가 있습니다 '${1+"$@"}'. $@는 makefile 대상 파일 이름입니다. 그런데 왜 사람들은 이처럼 복잡한 기호를 사용하려고 할까요 '${1+"$@"}'?

답변1

목적은 ${1+"$@"}휴대성입니다.

POSIX에서 정의한 $@위치 매개변수가 없으면 null로 확장됩니다. 그러나 원래 Bourne 쉘( /bin/shSolaris 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

더 많은 작업이 필요하지만 완전히 이식 가능합니다.

관련 정보