2

我有一个休闲脚本,它在开始时在 tcsh 中运行,然后在 tcl 中运行。我得到了错误badly placed ()'s,不明白为什么我得到它。

    #!/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 (wish) 开始运行的指示后才会出现错误消息:

> 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.
4

1 回答 1

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

以 a&结尾,这会在脚本上执行 TCL 解释器,但会继续在 csh 中执行。由于后面是 TCL 语法而不是 csh,因此这不能正确结束,并且确实 csh 在到达 line 时会抱怨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 本来就不是一个很好的脚本工具,甚至在交互式使用方面,tcsh 从 1990 年代初就被 zsh 超越,而 bash 在 1990 年代后期赶上了。现在你会发现很多没有 csh 的 unix 系统,而每个 unix 系统都有一个 Bourne 风格的 shell as /bin/sh,你很难找到一个太旧以至于它不理解"$@"的 .

#!/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" "$@"
#\
exit
于 2012-08-22T11:51:07.623 回答