Что этот определенный кусок делает в этом фрагменте кода TCL - PullRequest
0 голосов
/ 31 октября 2018

Мне любопытно, что этот "2> @ stderr <@ stdin" делает в этом фрагменте кода в TCL: </p>

if {[catch {eval exec $listCmds 2>@ stderr <@ stdin } cmdList] } { …

Исходя из того, что я знаю, catch запускает команду во внутренних фигурных скобках {} и сохраняет результат в cmdList. Если он был успешным, он не вводит оператор if, а если нет, то делает это. PS: Я из C ++.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

И пропущенный фрагмент к Ответ Колина - это сочетание stderr catch / exec / redirect: only stdout порожденного процесса будет записано в cmdList.

  • если вы не перенаправите stderr процесса в stderr Tcl, тогда 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<
    
  • при перенаправлении stderr exec теперь не знает о stderr процесса, и результат catchVar не будет его захватывать

    $ 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<
    

    Обратите внимание, как "to stderr" появляется сам по себе. Теперь мы можем перенаправить его как любой другой вывод stderr:

    $ 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<
    
0 голосов
/ 31 октября 2018

eval exec $listCmds запускает отдельную программу с именем и аргументами, взятыми из переменной listCmds. (На самом деле, более современная и безопасная идиома для этого была бы exec {*}$listCmds).

2>@ stderr перенаправляет стандартный вывод ошибок из этой программы в стандартный канал ошибок сценария Tcl, см. https://www.tcl.tk/man/tcl/TclCmd/exec.htm#M20.

<@ stdin перенаправляет стандартный ввод этой программы из стандартного канала ввода сценария Tcl, см. https://www.tcl.tk/man/tcl/TclCmd/exec.htm#M11.

...