2013-05-29 142 views
0

我想從tcl使用bsub命令執行perl腳本。它執行了第一個命令,但之後它沒有打印puts值,也沒有執行其他命令。使用bsub從tcl執行Perl腳本

eval [exec bsub -Ip -R "type=SPARC" -cwd /usr2/STATUS \ 
    '/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_submit \ 
    $c $T $E $review $Error $Reset $Analysis_Error \ 
    $DFTDSM_Analysis_Error $LP_Analysis_Error'] 

puts "error entered" 

eval [exec bsub -Ip -R "type=SPARC" -cwd /usr2/STATUS \ 
    '/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit \ 
    $c $T $W $Lint_Review_warning $Lint_Must_warning $Lint_Reset_warning \ 
    $DFT_Analysis_warning $DFTDSM_Analysis_warning $LP_Analysis_warning'] 

eval [exec bsub -Ip -R "type=SPARC" -cwd /usr2/SsATUS \ 
    '/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit \ 
    $chip $TOP $runtime $run_time_lint_Review $run_time_lint_must \ 
    $run_time_Lint_Reset $run_time_DFT_Analysis $run_time_DFTDSM_Analysis \ 
    $run_time_LP_Analysis'] 

回答

2

我假設上面的代碼是Tcl。我在這裏看到的幾個問題:

  1. 爲什麼EVAL?它是否輸出要執行的Tcl代碼?
  2. 你真的想以下參數:

    bsub 
    -Ip 
    -R 
    type=SPARC 
    -cwd 
    /usr2/STATUS 
    '/usr2/j/local/bin/perl5.6.1 
    /usr2/j/CAM_STATUS/auto_submit 
    $c 
    $T 
    $E 
    $review 
    $Error 
    $Reset 
    $Analysis_Error 
    $DFTDSM_Analysis_Error 
    $LP_Analysis_Error' 
    

    我想你想exec bsub -Ip -R type=SPARC -cwd /usr2/STATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_submit $c $T $E $review $Error $Reset $Analysis_Error $DFTDSM_Analysis_Error $LP_Analysis_Error"

    使用"爲分組,如果你想變量替換,否則{}(請注意,Tcl的使用它是這個自己的變量,如果你想要的環境變量,使用$ENV(FOO)

  3. 你得到的標準輸出從exec當chil d過程已完成。如果出現錯誤(寫入stderr或返回代碼!= 0),則會拋出錯誤。如果是這種情況,請使用周圍的catch。如果你只是想打印到std *,你既可以從子進程STD *重定向到STD *通道與下面的「論據」:>@stdout 2>@stderr

所以我相信你的代碼看起來應該多於或少像這樣(取決於你要存檔的):

exec bsub -Ip -R type=SPARC -cwd /usr2/STATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_submit $c $T $E $review $Error $Reset $Analysis_Error $DFTDSM_Analysis_Error $LP_Analysis_Error" >@stdout 2>@stderr 
puts "error entered" 
exec bsub -Ip -R type=SPARC -cwd /usr2/STATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit $c $T $W $Lint_Review_warning $Lint_Must_warning $Lint_Reset_warning $DFT_Analysis_warning $DFTDSM_Analysis_warning $LP_Analysis_warning" >@stdout 2>@stderr 
exec bsub -Ip -R type=SPARC -cwd /usr2/SsATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit $chip $TOP $runtime $run_time_lint_Review $run_time_lint_must $run_time_Lint_Reset $run_time_DFT_Analysis $run_time_DFTDSM_Analysis $run_time_LP_Analysis" >@stdout 2>@stderr 
+1

如果程序_does_輸出Tcl的代碼,我會考慮在安全解釋評估它從做「惡事」停止它。 –

+1

爲了強調,單引號在Tcl中沒有特殊含義。 Tcl相當於shell的單引號是'{大括號}' –