/ bin / sh中的$ {1:+“$ @”}

我注意到有时包装脚本将使用${1:+"$@"}作为参数,而不仅仅是"$@"

例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用

exec "$binary" $opts ${1:+"$@"}

任何人都可以将${1:+"$@"}分解为英文,并解释为什么它比纯"$@"更具优势?


'歇斯底里葡萄干',又名历史原因。

JesperE(或Bash手册页)的解释对于它的作用是准确的:

如果存在$ 1并且不是空字符串,则替换引用的参数列表。

大约20年前,如果没有参数,Bourne Shell的一些细小变体替换为“$ @”的空字符串“”,而不是正确的当前行为替换任何内容。 是否有任何此类系统仍在使用中,可以进行辩论。

[嗯:这种扩展不能正确工作:

command '' arg2 arg3 ...

在这种情况下,正确的表示法是:

${1+"$@"}

无论$ 1是否为空参数,此功能都可以正常工作。 所以,有人不正确地记住了这个符号,意外地引入了一个错误。]


引用的相关部分man bash的信息, 乔纳森莱弗勒提到在他的评论:

当不执行子字符串扩展时,bash将测试未设置或为空的参数; 省略冒号只会导致未设置参数的测试。

(强调我的)


从bash手册页:

   ${parameter:+word}
          Use Alternate Value.  If parameter is null or unset, nothing  is
          substituted, otherwise the expansion of word is substituted.

因此,除非$1未被设置,否则"$@"被替换。 我看不出为什么他们不能使用"$@"

链接地址: http://www.djcxy.com/p/25563.html

上一篇: ${1:+"$@"} in /bin/sh

下一篇: How to set current working directory to the directory of the script?