2016-07-27 2 views
2

나는 Tcl에서`exec '에 전달 될 때 쉘이 변수의 내용을 해석하지 못하게하려면 어떻게해야합니까?

couldn't read file "html> 
    <title>cama_Investigate 00000560554PONY1</title> 
    <style type="text/css"> 
    ... 
    ... 
    ... 
, 일부 예전의 코드를 유지하고 다음 조각 ...
if {[catch {exec -- echo $html_email > $file} ret]} { 
    puts $ret 
    return 0 
} 

이 ... 인해 HTML 이메일의 첫 번째 문자로 나누기 <되는 것을 발견 해요

은 I/O 경로 지정 연산자로 해석됩니다. 이전에이 문제는 문제가되지 않았습니다. 일부 헤더 (예 : )로 이메일을 시작했기 때문입니다. 통과 할 때 쉘에 의해 해석되는 변수의 내용을 보호하는 적절한 방법은 무엇 : 나는이 모든 O /은 Tcl의 기본 파일 I을 사용하여 다시 작성하는거야, 그래서이 질문은 주로 학문적 인

append html_email "Content-Type  : text/html; charset=us-ascii\n" 
append html_email "Content-Disposition: inline\n" 

~ exec?

나는 Tcl 8.0.5와 csh를 사용하고 있지만 가능하면 일반적인 대답에 관심이있다.

답변

2

Tcl의 exec은 펑키합니다. < 문자로 시작하는 인수를 리디렉션으로 해석해야한다고 주장합니다. (다른 것들도 있지만, 적중률은 적습니다.) 임시 파일에 데이터를 쓰고 그로부터 리다이렉트하는 것 이외에는 좋은 해결책이 없습니다.

set ctr 0 
while 1 { 
    set filename /tmp/[pid].[incr ctr].txt 
    # POSIX-style flags; write-only, must create or generate error 
    if {[catch {open $filename {WRONLY CREAT EXCL}} f] == 0} break 
} 
puts $f $html_email 
close $f 
exec echo <$filename >$file 
file delete $filename 

이 끔찍하게 복잡하다! 우리는 우리가 사용하는 프로그램을 변경함으로써 훨씬 나아질 수 있습니다. 대신 echo을 사용하는 우리가 cat를 사용하는 경우, 우리는 exec의 히어 닥 구문을 사용할 수 있습니다 :

exec cat <<$html_email >$file 

이 경우에는 문자는 훨씬 적은있다 (티클은이 작업을 수행하는 방법이다) 파이프 라인을 통해 직접 전달되고 있기 때문에 잘못. 그러나 그건 여전히 바보 이후 티클의 더 이식성, 그리고 적은 오버 헤드로 직접 파일에 쓰기의 전체 수 :

set f [open $file "w"] 
puts $f $html_email 
close $f 

예,이 실제로 첫 번째 예에서 일반 교체의 상당히 단순화 된 버전입니다 위. 그 이후로 훨씬 더 명백한 단순한 일을하자. 앞으로는 놀라지 않을 것이다.

+0

앞에'할 ... 루프가 적절할 것 while' 네이티브. 명시적인 '중단'은이를 단순화합니다. –

0

당신은 쉘을 통해 라우팅, 간접적으로 의도 된 명령을 호출 할 수 있습니다 티클 그들이없는 것을 제외하고,

exec -- csh -c "echo '$html_email'" > $file 

또는

exec -- csh -c "exec echo '$html_email'" > $file 
+0

그들은 매우 가공이 잘 안되는데,'''문자를 처리하지 못하기 때문에 (HTML에서 알맞게 나타납니다) 잘 처리하지 못하기 때문에 매우 취약합니다. –

관련 문제