2012-08-22 106 views
2

我有下面的脚本,在启动时运行在tcsh中,然后在tcl中运行。 我得到错误badly placed()'s,不明白为什么我得到它。在tcl/tcsh混合脚本上出现错误()的错误

#!/usr/intel/bin/tcsh -f 
    #\ 
    set TCL_VERSION="8.4.6o_64" 
    #\ 
    setenv WORK_AREA_ROOT_DIR . 
    #\ 
    exec ${CAD_ROOT}/tcl/${TCL_VERSION}/bin/wishx "$0" "$*" & 

    lappend auto_path $env(KITE)/lib/pwidget 
    lappend auto_path $env(KITE)/local_cad/nlview/tcl/ 
    lappend auto_path $env(KITE)/tcl/ 

    lappend auto_path $env(KITE)/gui/tcl/plotter 
    lappend auto_path $env(KITE)/gui/tcl/graph-class 

    package require Pwidget+ 
    package require Nlview 

    package require sparam_view_graph 

    package require BLT 
    namespace import -force ::blt::bgexec 

    source $env(KITE)/gui/tcl/sparam_view_env.tcl 
    source $env(KITE)/tcl/sparamParser.tcl 

    load $env(KITE)/lib/utils/libKitKiteUtilsTcl.so 
    source $env(KITE)/lib/utils/qbnamex.tcl 

    catch {delete object reg} 
    TclRegistry reg -varname _app 

    sparam_view_env "." $argv 

显示错误消息后,才得到一个迹象表明,TCL(希望)开始运行:

> bin/sparam_view_stand_alone.tcl /nfs/iil/proj/dt/epm16/work/imelam2/test/kite_check/kite/input/s2p/ISI_bit29.s2p 
[1] 11474 
Badly placed()'s. 
+1

我不认为这是一个TCL问题,它可能是一个tcsh问题。例如,请参阅[这里](http://www.unix.com/shell-programming-scripting/44014-badly-placed-s-error.html)。尝试在问题中添加Unix或Shell编程标签。 – TrojanName

回答

4
exec ${CAD_ROOT}/tcl/${TCL_VERSION}/bin/wishx "$0" "$*" & 

随着&末,该执行脚本上的TCL解释器,但在csh中保持执行状态。由于接下来的是TCL语法,但不是csh,这不能结束,事实上,当csh到达lappend auto_path $env(KITE)/lib/pwidget行时,它会发出抱怨。删除&

此外,"$*"连接所有参数并将它们传递到一个参数wishx。要保持参数不变,请使用${*:q}。另外,如果由于某种原因wishx解释器不存在,则应该退出脚本而不是在tcsh中执行它。

exec "${CAD_ROOT}/tcl/${TCL_VERSION}/bin/wishx" "$0" ${*:q} 
#\ 
exit 127 

哦,并考虑使用Bourne shell的语法来代替。 Csh is not a very good scripting tool in the first place,即使是交互式使用,tcsh自20世纪90年代初以来一直超过zsh,并且在20世纪90年代后期bash被追上。如今你会发现很多没有csh的unix系统,而每个unix系统都有一个Bourne风格的shell,如/bin/sh,你很难找到一个非常老的,因此它不会understand "[email protected]"

#!/bin/sh 
#\ 
TCL_VERSION="8.4.6o_64" 
#\ 
WORK_AREA_ROOT_DIR=. 
#\ 
export WORK_AREA_ROOT_DIR 
#\ 
exec "${CAD_ROOT}/tcl/${TCL_VERSION}/bin/wishx" "$0" "[email protected]" 
#\ 
exit 
+0

我认为这是一个很好的答案,直到你有点侮辱(“这是21世纪......”)。如果你将这一点改为不那么居高临下,你的答案会更好。 –

+0

@BryanOakley我没有看到任何侮辱,但在那里,我已经扩大了为什么使用sh。 – Gilles

+0

这现在是一个更好的答案。 –