大多数 makefile 都有这组奇怪的符号'${1+"$@"}'
。 $@ 是 makefile 目标文件名。但为什么人们尝试使用像这样的复杂符号'${1+"$@"}'
?
答案1
目的是${1+"$@"}
为了便携性。
POSIX 定义的 $@如果没有位置参数,将扩展为空。但原始的 Bourne shell(/bin/sh
Solaris 10 及之前版本)会将其扩展为空字符串""
。使用${1+"$@"}
是解决此问题的方法,因为"$@"
仅在设置了 if 时才展开$1
。
不幸的是,这个构造在 zsh 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 中使用该构造,因为它将被替换为"$@"
before 扩展(您必须完全使用字符串${1+"$@"}
,没有前导或尾随单词字符)。
"$@"
您可以做的另一个工作是,如果没有位置参数,则完全忽略使用,通过检查$#
:
case $# in
(0) func ;;
(*) func "$@" ;;
esac
它需要更多的工作,但完全便携。