首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行tclsh时,shell需要什么?

执行tclsh时,shell需要什么?
EN

Stack Overflow用户
提问于 2013-09-13 16:09:36
回答 4查看 9.6K关注 0票数 2
代码语言:javascript
复制
#!/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吗?

EN

回答 4

Stack Overflow用户

发布于 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之前。

在我的系统上(它被锁定到我的规范,但不再进一步),脚本:

代码语言:javascript
复制
#!/usr/bin/env tclsh
puts $tcl_version

工作正常,输出:

代码语言:javascript
复制
8.5

脚本也是如此:

代码语言:javascript
复制
#!/usr/bin/tclsh
puts $tcl_version

尽管如前所述,它与tclsh的系统版本绑定在一起,而不是我的第一个版本。

是的,根据下面的文字记录,你可以很好地理解这些论点:

代码语言:javascript
复制
pax> cat qq.tcsh
#!/usr/bin/tclsh
puts $argc
puts $argv

pax> qq.tcsh my name is pax
4
my name is pax
票数 3
EN

Stack Overflow用户

发布于 2013-09-13 16:45:18

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

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

代码语言:javascript
复制
 exec tclsh $0 ${1+$@} 

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-23 07:47:00

使用两行开头的原因是为了避免特殊shebang行上的32字符行限制。

代码语言:javascript
复制
#!/bin/sh
# A Tcl comment, whose contents don't matter \
exec /some/very/long/path/to/find/a/tcl/executable/path/tclsh "$0" "$@" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18781355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档