tclsh“$ 0”“$ @”中“$ @”的用途和功能

时间:2012-08-01 20:46:27

标签: tcl sh

我搜索得很长很难,但只能找到$@扩展内容的简短说明。

有人可以向我解释或提供一个链接,详细解释"$@"作为第二个参数的目的

tclsh "$0" "$@"

另外,我正在查看某人的脚本,他们有以下内容:

exec tclsh `basename $0` $*

$*在这种情况下做了什么?

非常感谢。

2 个答案:

答案 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一样标准化。