#!/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吗?
答案 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。