我注意到有时包装脚本将${1:+"$@"}
用于参数,而不仅仅是"$@"
.
例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用
exec "$binary" $opts ${1:+"$@"}
谁能分解${1:+"$@"}
成英语并解释为什么它比普通话更有优势"$@"
?
我注意到有时包装脚本将${1:+"$@"}
用于参数,而不仅仅是"$@"
.
例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用
exec "$binary" $opts ${1:+"$@"}
谁能分解${1:+"$@"}
成英语并解释为什么它比普通话更有优势"$@"
?
“歇斯底里的葡萄干”,又名历史原因。
JesperE(或关于shell 参数扩展的 Bash 手册页)的解释对于它的作用是准确的:
$1
存在且不是空字符串,则替换引用的参数列表。大约 20 年前,Bourne Shell 的一些损坏的次要变体在没有参数的情况下替换了一个空字符串,而不是当前的正确行为,即什么都不替换""
。"$@"
是否有任何这样的系统仍在使用中,还有待商榷。
[嗯:该扩展不适用于:
command '' arg2 arg3 ...
在这种情况下,正确的表示法是:
${1+"$@"}
$1
无论是否为空参数,这都能正常工作。所以,有人记错了符号,不小心引入了一个错误。]
从 bash 手册页:
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is
substituted, otherwise the expansion of word is substituted.
因此,"$@"
被替换,除非$1
未设置。我不明白为什么他们不能使用"$@"
.
引用Jonathan Leffler在评论中提到man bash
的信息的相关部分:
不执行子字符串扩展时,bash 测试未设置或 null的参数;省略冒号会导致仅对未设置的参数进行测试。
(强调我的)