#!/bin/sh
# A Tcl comment, whose contents don't matter \
exec tclsh "$0" "$@"为什么我们要在这里调用shell (#!/bin/sh)。
我们可以直接调用tclsh (#!/usr/sbin/tclsh)。假设tclsh位于sbin directoey中。
为什么我们首先调用shell,然后在shell中调用tclsh解释器。
为什么人们更喜欢使用这些(#!/bin/sh,exec tclsh "$0“"$@")。我们不能执行tclsh direclty吗?
发布于 2013-09-13 16:13:46
原因之一是,在某些系统上,您可以严格地锁定可以在shebang行中运行的可执行文件。换句话说,它可能会拒绝运行任何非/bin的东西。或者,如果您的管理员特别虐待狂,他们可能会试图强迫每个人使用zsh :-)
其次,这将根据您当前的路径设置运行tclsh。如果你想让不同的用户在不同版本的TCL上运行它,这是非常有价值的。否则,您必须在shebang行上给出一个绝对路径,这在不同的系统上可能是不同的(尽管/usr/bin/env也可以处理这一点)。
在提交脚本之前,使用较新版本的tclsh测试脚本也很方便。例如,您可以在当前最新的Debian (7.1)下使用tclsh8.5,同时测试Tcl8.6,方法是在$HOME/staging/tcl86中构建它并更改路径,使该目录显示在usr/bin之前。
在我的系统上(它被锁定到我的规范,但不再进一步),脚本:
#!/usr/bin/env tclsh
puts $tcl_version工作正常,输出:
8.5脚本也是如此:
#!/usr/bin/tclsh
puts $tcl_version尽管如前所述,它与tclsh的系统版本绑定在一起,而不是我的第一个版本。
是的,根据下面的文字记录,你可以很好地理解这些论点:
pax> cat qq.tcsh
#!/usr/bin/tclsh
puts $argc
puts $argv
pax> qq.tcsh my name is pax
4
my name is pax发布于 2013-09-13 16:45:18
当您有一个这样的脚本,并且您从命令行运行它时,系统会认为它是一个shell脚本,并将开始运行每一行,就好像它是一个shell命令一样。
$0和$@是外壳变量..$0表示tcl脚本路径,${1+$@}表示“如果设置了第一个参数,则表示所有参数”,因此,
exec tclsh $0 ${1+$@} 意味着在停止shell之后,通过传递脚本文件(通过$0)和rest参数(通过${1+$@})来执行tclsh
当tclsh启动时,像argv、argv这样的tcl变量就会出现。
发布于 2013-11-23 07:47:00
使用两行开头的原因是为了避免特殊shebang行上的32字符行限制。
#!/bin/sh
# A Tcl comment, whose contents don't matter \
exec /some/very/long/path/to/find/a/tcl/executable/path/tclsh "$0" "$@" https://stackoverflow.com/questions/18781355
复制相似问题