Scripting 在这段TCL代码中,这段代码做了什么

Scripting 在这段TCL代码中,这段代码做了什么,scripting,tcl,tk,Scripting,Tcl,Tk,我很好奇这个“2>@stderreval exec$listCmds运行的是一个单独的程序,其名称和参数取自变量listCmds(实际上,更现代、更安全的习惯用法是exec{*}$listCmds) 2>@stderr将此程序的标准错误输出重定向到Tcl脚本的标准错误通道,请参阅 而缺少的部分是catch/exec/redirect stderr的组合:仅生成的进程的stdout将在cmdList中捕获 如果不将进程的stderr重定向到Tcl的stderr,则exec会将进程的任何stder

我很好奇这个“2>@stderr
eval exec$listCmds
运行的是一个单独的程序,其名称和参数取自变量listCmds(实际上,更现代、更安全的习惯用法是
exec{*}$listCmds

2>@stderr
将此程序的标准错误输出重定向到Tcl脚本的标准错误通道,请参阅

而缺少的部分是catch/exec/redirect stderr的组合:生成的进程的stdout将在
cmdList
中捕获

  • 如果不将进程的stderr重定向到Tcl的stderr,则exec会将进程的任何stderr输出视为错误:

    $ echo '
        set rc [catch {exec sh -c {echo to stdout; echo to stderr >&2}} result]
        puts "rc=$rc result=>$result<"
    ' | tclsh
    rc=1 result=>to stdout
    to stderr<
    
    $echo'
    设置rc[catch{exec sh-c{echo to stdout;echo to stderr>&2}}结果]
    
    将“rc=$rc result=>$result$result$result$result”添加到社区wiki中,以跟进您的答案。请随意添加或编辑。
    $ echo '
        set rc [catch {exec sh -c {echo to stdout; echo to stderr >&2}} result]
        puts "rc=$rc result=>$result<"
    ' | tclsh
    rc=1 result=>to stdout
    to stderr<
    
    $ echo '
        set rc [catch {exec sh -c {echo to stdout; echo to stderr >&2} 2>@stderr} result]
        puts "rc=$rc result=>$result<"
    ' | tclsh
    to stderr
    rc=0 result=>to stdout<
    
    $ echo '
        set rc [catch {exec sh -c {echo to stdout; echo to stderr >&2} 2>@stderr} result]
        puts "rc=$rc result=>$result<"
    ' | tclsh 2>/dev/null
    rc=0 result=>to stdout<