2

我已经搜索了很长时间,但只能找到一个$@扩展某些内容的简短解释。

有人可以解释一下或向我提供一个链接,详细解释"$@"第二个论点的目的吗?

tclsh "$0" "$@"

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

exec tclsh `basename $0` $*

在这种情况下做什么$*

非常感激。

4

2 回答 2

4

这实际上不是 Tcl,而是 bash。#!/bin/bash \在第一行使用它曾经(或现在)并不少见。Tcl 也会忽略下一行(因为\在行尾),bash 会执行它。

关于 $* 和 $@,我建议阅读bash的手册页(在特殊参数下)。`用于命令替换,类似于 Tcl[]

于 2012-08-01T22:32:53.377 回答
4

这些是 Tcl 脚本中经常使用的引导节的一部分。让我们得到整个节:

#!/bin/sh
# A Tcl comment, whose contents don't matter \
exec tclsh "$0" "$@"

第一行将脚本作为 Bourne shell 程序运行(bash 和许多其他 shell 的工作方式相同;它是 POSIX 规范)。第二行被 shell 忽略。第三行 用传递给 shell 的参数用 tclsh替换shell。"$0"是脚本的名称,并且对于"$@"所有带有适当引用的参数来说都是神奇的。(您可能还会看到${1+"$@"}在某些较旧的 shell 中哪个是恶意错误的解决方法。)理论上您可以省略exec这里,但这意味着脚本的其余部分将在 Tcl 程序终止时由系统 shell 解释;这可能不是你想要的。最后,当 tclsh 看到上面的那些行时,它认为它们都是评论; Tcl 注释从#行首的 a 开始(或前面有空格),并在允许行继续标记后继续到行尾。(是的,这很不寻常。不过很有用。)

with 的形式basename很不寻常,因为它正在删除正在执行的文件的任何路径。这可能不是一个好主意,因为它可能意味着 tclsh 并不确切知道要执行哪个文件。同样,$*也几乎但不正确(它扩展到所有参数,但没有引用;如果用户传入带有空格的文件名,您很快就会看到区别!)

最后,这些天来,使用这样的起始节被认为是最佳实践:

#!/usr/bin/env tclsh

它更短,更不容易出错,并且与 shell 一样标准化。

于 2012-08-02T10:24:27.237 回答