0

从 /usr/local/bin/erl

ROOTDIR=/usr/local/lib/erlang
BINDIR=$ROOTDIR/erts-5.9.1/bin
EMU=beam
PROGNAME=`echo $0 | sed 's/.*\///'`
export EMU
export ROOTDIR
export BINDIR
export PROGNAME
exec $BINDIR/erlexec ${1+"$@"}

我知道 "$@" meams 参数。但是 {1+"$@"} 是什么意思?

4

2 回答 2

4

larsmans 提供了语义的解释,但没有说明为什么${1+"$@"}不同于simple "${@}"。在行为正常的 shell 中,"${@}" 扩展为空。也就是说:如果“$@”为空,foo "$@"则应不带参数调用。foo在行为不正确的 shell 中,foo "$@"将使用一个参数(空字符串)调用。许多历史上的 shell 将 "$@" 扩展为空字符串而不是空字符串,但${1+"$@"}正确地扩展为空字符串。

于 2013-10-09T14:21:50.087 回答
4

来自 IEEE Std 1003.1 (POSIX 2013),Shell 命令语言

${parameter:+[word]}

使用替代价值。如果参数未设置或为空,则应替换为空;否则,应替换 word 的扩展(如果 word 省略,则为空字符串)。

即,${1+"$@"}扩展为"$@"命令行参数的值,除非$1未设置,即没有命令行参数,在这种情况下,表达式扩展为空。一个显示其工作原理的更简单的脚本是

echo '"' ${1+"$@"} '"'

如果将其存储在文件中test.sh并运行它,您将获得:

/tmp$ sh test.sh
" "
/tmp$ sh test.sh 1
" 1 "
/tmp$ sh test.sh 1 2
" 1 2 "

(开头和结尾的空格来自echo。)

于 2013-10-09T14:14:15.157 回答