alias -g '${1+"$@"}'='"$@"',它有什么作用?

alias -g '${1+"$@"}'='"$@"',它有什么作用?

大多数 makefile 都有这组奇怪的符号'${1+"$@"}'。 $@ 是 makefile 目标文件名。但为什么人们尝试使用像这样的复杂符号'${1+"$@"}'

答案1

目的是${1+"$@"}为了便携性。

POSIX 定义的 $@如果没有位置参数,将扩展为空。但原始的 Bourne shell(/bin/shSolaris 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

它需要更多的工作,但完全便携。

相关内容