2016-09-12 1 views
1

tcl list에 저장된 명령을 실행하는 tcl 절차가 있습니다. 예를 들어 :목록에 특수 문자가있는 TCL exec

: 간부 인 옵션으로 대체의 모습을 한 후

(.*[/\])?(sh|bash)(\.exe)? 

: 옵션의

--option1 op1 --option2 op2 --option3 op3 ... 

한 모습 정규 표현식이다 :

catch { exec $list} 

목록과 같이 보입니다

{(.*[/\])?(sh|bash)(\.exe)?} 

하지만 내가 필요로하는 것은 : 내가 그런 상황에서 할 수있는 일

"(.*[/\])?(sh|bash)(\.exe)?" 

?

답변

4

목록을 문자열로 변환하면 정규 형식으로 변환되어 다시 같은 목록으로 변환됩니다.

정규식이 올바르게 다시 변환되도록하기 위해 사용되는 인용 문자가 표시됩니다.

값이 정확합니다.

exec $listexec에 하나의 인수 만 전달합니다. exec은 단어를 포함하는 목록이 아닌 일련의 단어를 인수로 사용합니다.

exec 명령 같아야

catch { exec {*}$list } 

{*} 구문은 컴포넌트 말로 목록으로 변환한다.TCL의 이전 버전에서

는 평가 후면 문을 사용해야합니다

catch { eval exec $list } 

참고 : exec, eval, {*} (section 5 of Tcl)

0
  1. 간부가 서브 프로세스

  2. 로 commnad을 실행하는 것입니다을
  3. 세미콜 참조 :

    작품 수 :

    exec ps aux | 그렙 tclsh

    작동하지 :

    exec "ps aux | grep tclsh"

    exec [list ps aux | grep tclsh]

    하지만 잘 작동합니다 :

    eval exec "ps aux | grep tclsh"

    eval exec [list ps aux | grep tclsh]

그래서 우리는 실행 - 생성 명령 (exec ps aux | grep tclsh)을 실행하기 전에 평가하고 호출하고 있습니다. 따라서 eval은 유형에 대해 신경 쓰지 않습니다.

옵션을 사용하여 현재 상황에
    1. 을 : exec someExecutable --option1 op1 --option2 op2 --option3 (.*[/\])?(sh|bash)(\.exe)?

    나는 그런 솔루션을 recoment 것 : [join $cmd] 목록에서 문자열을 생성

    set op3 {"(.*[/\])?(sh|bash)(\.exe)?"} 
    lappend cmd [someExecutable --option1 op1 --option2 op2 --option3 $op3] 
    set cmd [join $cmd] 
    eval exec $cmd 
    

    - 그리고이 아니다 임의 { }