执行tclsh时shell需要什么

时间:2013-09-13 08:09:36

标签: shell tcl

#!/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 interpreter。

为什么人们更喜欢使用这些(#!/ bin / sh,exec tclsh“$ 0”“$ @”)。我们不能执行tclsh direclty吗?

4 个答案:

答案 0 :(得分:2)

出于某种原因,在某些系统上,您可以严格锁定可以在shebang行中运行的可执行文件。换句话说,它可能拒绝运行/bin以外的任何内容。或者,如果您的管理员特别虐待,他们可能会试图强迫每个人使用zsh: - )

其次,这将根据您当前的路径设置运行tclsh。如果您希望不同的用户使用不同版本的TCL运行它,这是非常宝贵的。否则,你必须在shebang线上给出绝对路径,这在不同系统上可能会有所不同(尽管/usr/bin/env也可以处理)。

在提交之前,使用更新版本的tclsh测试脚本也很方便。例如,您可以在当前最新的Debian(7.1)下使用tclsh 8.5,同时在$HOME/staging/tcl86中构建TCL 8.6并更改路径,以便在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

答案 1 :(得分:1)

如果你有这样的脚本,并且从命令行运行它,系统会认为它是一个shell脚本,并且会开始像运行shell命令一样运行每一行。

$ 0和$ @是shell变量.. tcl脚本路径为0美元,$ {1 + $ @}表示“所有参数,如果设置了第一个参数”,因此,

 exec tclsh $0 ${1+$@} 

表示停止shell后,通过传递脚本文件(通过$ 0)和其他参数(通过$ {1 + $ @})执行tclsh

当tclsh启动时,像argv,argv这样的tcl变量将会出现。

答案 2 :(得分:0)

两行开始的原因是在特殊的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" "$@" 

答案 3 :(得分:0)

正如@Shawn所提到的,主要的历史原因是某些旧的Unices无法承受长时间的撞击。

第二个原因是系统布局方面的可移植性。您的示例#!/usr/sbin/tclsh是一个很好的示例,因为它在我的计算机上不起作用。 tclsh中没有/usr/sbin~/.nix-profile/bin/tclsh中是我的。对于在tclsh中拥有/usr/sbin但希望将tclsh放在其PATH中的其他版本的用户来说,它也不适合。

可能会认为我们可以只使用#!tclsh来解决这两个问题,但是今天仍然有许多系统需要绝对路径。但是,有一个非正式的官方便携式解决方案:

#!/usr/bin/env tclsh

这可以在您普通的GNU / Linux发行版,Windows的cygwin / msys2以及过去20多年的所有Unices中使用。就是shebang,例如tklib使用:https://github.com/tcltk/tklib/commit/4ea165c5d8b126185e4bbb341e53289a0efc931d

这个技巧是如此的广泛,并且预期不仅对tcl有用,而且对其他方面也起作用,以至于NixOS甚至有一个/usr/bin也有一个/usr/bin/env

有关/usr/bin/env和一般解释器的更多信息,请参见https://askubuntu.com/questions/88314/what-type-of-path-in-shebang-is-more-preferable

有关shebangs和Tcl的更多信息,请参见https://wiki.tcl-lang.org/page/exec+magic