我注意到有时包装脚本会使用${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:+"$@"}
用英语解释并解释为什么它比普通的"$@"
更具优势吗?
'Hysterical Raisins'(历史原因的意思),也被称为“Historical Reasons”。
JesperE(或Bash man页面上有关shell parameter expansion的说明)的解释准确描述了其功能:
$1
存在且不为空字符串,则替换为引用的参数列表。大约20年前,Bourne Shell的一些损坏的小变体在没有参数的情况下将空字符串""
替换为"$@"
,而不是正确的当前行为-不进行任何替换。这些系统是否仍在使用尚不确定。
[嗯:该扩展对于以下情况无法正常工作:
command '' arg2 arg3 ...
${1+"$@"}
$1
是空参数还是非空参数。因此,某人错误地记住了符号,导致意外引入了一个 bug。从bash手册中得知:
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is
substituted, otherwise the expansion of word is substituted.
$1
,否则将替换"$@"
。我不明白为什么他们不能只使用"$@"
。man bash
的相关部分:
当不执行子字符串扩展时,bash会测试一个参数是否为未设置或空值;省略冒号只会测试一个未设置的参数。
(强调是我的)
以下是一些其他提示,以便得到更完整的答案...
使用可以涉及 shebang 行,该行从未被彻底记录,并且通常期望有一个单独的参数。
因此,如果文件名包含空格或超过允许的长度,则似乎是一种解决方法。
来自 Perl man page:
比
$*
更好的构造是 ${1+"$@"},它处理文件名中的嵌入式空格等,但如果脚本由 csh 解释,则不起作用。
来自 TCL man page:
许多 UNIX 系统不允许 #! 行长度超过约 30 个字符,因此请确保可以使用短文件名访问 tclsh 可执行文件。
最后,一些实用程序可能支持 cat
命令的晦涩但方便的特性: