Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3396842
  • 博文数量: 631
  • 博客积分: 10716
  • 博客等级: 上将
  • 技术积分: 8397
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 22:35
文章分类

全部博文(631)

文章存档

2020年(2)

2019年(22)

2018年(4)

2017年(37)

2016年(22)

2015年(1)

2013年(12)

2012年(20)

2011年(19)

2010年(20)

2009年(282)

2008年(190)

分类:

2009-04-03 12:53:53

[root@ntp tcl]# vi timed-run.tcl

exec tclsh "$0" ${1+"$@"}

#
# run a program for a given amount of time,
# aborting after the number of seconds
#
# Usage:
# tclsh timed-run.tcl 20 long_running_program  program_args
#
# Author: Jeff Hobbs, based off shorter example by Don Libes
#

# This is required to declare that we will use Expect
package require Expect

proc usage {} {
    puts stderr "usage: $::argv0   "
    exit 1
}


if {$argc < 2} { usage }

# timeout value is first to be passed in
set timeout [lindex $argv 0]
if {![string is integer -strict $timeout]} { usage }

# program and args are the rest
set cmd [lrange $argv 1 end]

# invoke the cmd with spawn
eval spawn $cmd

# just call expect and wait for it to timeout or eof to occur
expect




运行结果:

[root@ntp tcl]# ./timed-run.tcl
usage: ./timed-run.tcl  

以下调用 vmstat 运行时间长1秒,自然退出
[root@ntp tcl]# ./timed-run.tcl  9 vmstat
spawn vmstat
   procs                      memory      swap          io     system      cpu
 r  b  w   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id
 0  0  0      0 835304  43340  90120    0    0     0     4   83    40  0  0 100

以下调用 vmstat 运行时间长9秒,超时退出
[root@ntp tcl]# ./timed-run.tcl  9 vmstat 1
spawn vmstat 1
   procs                      memory      swap          io     system      cpu
 r  b  w   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id
 1  0  0      0 835304  43340  90120    0    0     0     4   83    40  0  0 100
 0  0  0      0 835304  43340  90120    0    0     0     0 1019    33  0  0 100
 1  0  0      0 835300  43340  90120    0    0     0     0 1024    48  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0   272 1046    88  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0     0 1029    57  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0     0 1035    59  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0     0 1048    91  1  1 98
 0  0  0      0 835980  43340  90108    0    0     0     0 1031    51  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0    12 1023    54  0  0 100
 1  0  0      0 835980  43340  90108    0    0     0     0 1016    38  0  0 100
[root@ntp tcl]#


[root@ntp tcl]# cat timed-run.tcl
#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
优点:
1,二进制文件的位置不需要填入,它可以在你的 shell 查找路径中的任何地方。
2,突破了#!只有30个字符的限制
3,再shell中, 第2行是注释,第3行不是.但是在tcl中, \是连接符号,下一行依旧是注释.所以只有shell有机会执行第3行. 语句导致 shell 停止处理而启动 tclsh 来重新处理整个脚本。当 tclsh启动时,因为第二行的反斜线导致第三行被作为第二行注释的一部分,它把所有三行都作为注释对待。


exec tclsh "$0" ${1+"$@"}
很多地方是这样表达:
exec wish "$0" "$@"

[root@ntp tcl]# vi test

#!/bin/sh
# \
echo hello
echo $0
echo ${1+"$@"}
echo "$@"

[root@ntp tcl]# ./test 1 2 3
hello
./test
1 2 3
1 2 3

可见两者没有太大的区别.

$::argv0 应该是TCL在双引号中调用系统参数的方法?

阅读(2095) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~