我搜索得很长很难,但只能找到$@
扩展内容的简短说明。
有人可以向我解释或提供一个链接,详细解释"$@"
作为第二个参数的目的
tclsh "$0" "$@"
另外,我正在查看某人的脚本,他们有以下内容:
exec tclsh `basename $0` $*
$*
在这种情况下做了什么?
非常感谢。
答案 0 :(得分:4)
这实际上不是Tcl,而是bash。在第一行使用#!/bin/bash \
并不常见。 Tcl也会忽略下一行(因为行尾的\
),bash会执行它。
关于$ *和$ @,我建议阅读bash的手册页(在特殊参数下)。 `
用于命令替换,类似于Tcl的[
和]
答案 1 :(得分:4)
这些是Tcl脚本中经常使用的bootstrapping节的一部分。让我们来看看整个节:
#!/bin/sh
# A Tcl comment, whose contents don't matter \
exec tclsh "$0" "$@"
第一行将脚本作为Bourne shell程序运行(bash和许多其他shell以相同的方式工作;它是POSIX规范)。 shell会忽略第二行。第三行用tclsh替换 shell,其中包含传递给shell的参数。 "$0"
是脚本的名称,"$@"
对于具有适当引用的所有参数都是神奇的。 (您可能还会看到${1+"$@"}
这是一些旧版shell中的恶意漏洞的解决方法。)理论上你可以在这里省略exec
,但这意味着系统会解释其余的脚本终止Tcl程序时的shell;这可能不是你想要的。最后,当tclsh看到上面的那些行时,它认为它们是所有注释; Tcl注释从一行开头#
开始(或前面有空格),并在允许行连续标记后继续到行的末尾。 (是的,这很不寻常。虽然很有用。)
带有basename
的表单相当不寻常,因为它正在删除正在执行的文件的任何路径。这可能不是一个好主意,因为它可能意味着tclsh并不确切知道要执行哪个文件。类似地,$*
也几乎但不正确(它扩展到所有参数,但没有引用;如果用户传入带有空格的文件名,您很快就会看到差异! )
最后,这些天最好使用这样的起始节:
#!/usr/bin/env tclsh
它更短,更不容易出错,而且与shell一样标准化。