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

我们为什么要在这里调用 shell (#!/bin/sh) 。

我们可以直接调用 tclsh (#!/usr/sbin/tclsh) 。让我们假设 tclsh 在 sbin 目录中。

为什么我们首先调用 shell,然后在 shell 内部调用 tclsh 解释器。

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

4

4 回答 4

3

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

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

tclsh在提交之前使用更新版本的脚本测试脚本也很方便。例如,您可以在当前最新的 Debian (7.1) 下拥有 tclsh 8.5,同时通过构建 TCL 8.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-13T08:13:45.593 回答
1

当你有这样的脚本,并从命令行运行它时,系统会认为它是一个 shell 脚本,并将开始运行每一行,就好像它是一个 shell 命令一样。

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

 exec tclsh $0 ${1+$@} 

意味着在停止 shell 之后,通过传递脚本文件(通过 $0)和其余参数(通过 ${1+$@})来执行 tclsh

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

于 2013-09-13T08:45:17.880 回答
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" "$@" 
于 2013-11-22T23:47:00.180 回答
0

正如@Shawn 所提到的,主要的历史原因是一些旧的Unices 无法处理长时间的shebang。

第二个原因是系统布局方面的可移植性。你的例子#!/usr/sbin/tclsh是一个很好的例子,因为它不能在我的机器上工作。没有tclsh/usr/sbin,我的在~/.nix-profile/bin/tclsh。它也不适合拥有tclshin/usr/sbin但更喜欢tclsh他们之前在其PATH.

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

#!/usr/bin/env tclsh

这适用于您的普通 GNU/Linux 发行版、Windows 中的 cygwin/msys2 以及二十多年前的各种 Unices。它是例如tklib使用的shebang: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

于 2019-01-16T09:20:48.373 回答