2011-05-11 2 views
6

나는 파일 내용에 eval을하고 있습니다. 파일은 내가 분석 한 레이블로 만들어져 있습니다. 각 줄에는 레이블이 있으며 각 레이블에 proc이 정의되어 있으므로 eval이 성공합니다. 그러나 알 수없는 명령으로 인해 사용자가 새 레이블을 추가 한 다음 eval 명령이 실패하는 경우가 있습니다.알 수없는 명령에서 Tcl이 충돌하지 않도록하기

알려지지 않은 명령이 eval 일 때 Tcl이 충돌하는 것을 방지 할 수있는 방법이 있습니까?
이상적으로는 오류를 priting하고 eval 같이 계속 내 자신의 정의 된 동작으로 대체 할 수 있어야합니다.


편집는 :

불행하게도, 난 단지는 Tcl 8.4을 사용할 수 있습니다. 다음

proc handle_unknown_label {cmd args} { ... } 

과 :
난 다음, as suggested here 일을 시도

rename unknown _old_system_unknown 
rename handle_unknown_label unknown 

catch {set ret [eval $x]} err 

rename unknown handle_unknown_label 
rename _old_system_unknown unknown 

하지만 난 여전히 eval에 대해 동일한 동작을 얻을, 그리고 다음과 같은 오류 인쇄 :

절차 알 수없는 보호 된 proc이며 이름이 바뀌지 않습니다
프로 시저 알 수없는 프로 tected proc 디렉토리 및
절차 알 수없는 오버라이드 (override)되지 않습니다는 보호 PROC이며
절차 알 수없는 보호 된 PROC입니다 이름이 변경되지 않습니다와 같은 소요되는

+1

해당 사항 없음 그러나 파일을 읽고 평가 중이라면 대신 파일을 원본으로 사용할 수 있습니까? –

+1

이 Tcl 인터프리터는 어떤 환경입니까? 나는 그 "보호 된 proc"오류에 익숙하지 않다. –

+0

@ 글렌 흥미 롭습니다. 이게 내 회사에서 무력화 된 것일 수 있니? –

답변

2

자신의 명령을 unknown라는 구현 오버라이드 (override)되지 않습니다 그 인수를 모두 찾을 수없는 명령을 구성하는 단어와 그 인수 :

당신이 namespace unknown의 사용과 애호가 얻을 수 있지만, 할 필요에 대해 전부
proc unknown {cmdName args} { 
    puts "UNKNOWN COMMAND: $cmdName" 
    puts "CALLED WITH ARGUMENTS: $args" 
} 

.

+0

감사! 'namespace unknown' 명령을 어떻게 사용할 수 있습니까? 일시적으로 알려지지 않은 명령의 처리를 변경하고 싶으므로 기본 처리 방법을 변경 한 다음 복원하는 방법을 알고 싶습니다. –

+0

내 편집을 참조하십시오. –

+0

@Amir : 누군가가 당신을 무겁게 잠궈 버렸기 때문에 (우리는 아마도 호스팅 시스템에서 문서를 읽는 것 외에는) 제안 할 수있는 것이 많지 않습니다. 언어의 표준 메커니즘을 말씀 드렸습니다 ... –

3

나는 명백하게 말하고 있지만, eval은 파일을 위험에 빠뜨린다 : 모든 사용자는 [exec whatever they wish]을 이러한 파일에 포함시킬 수 있습니다.

"라벨"을 읽고 거대한 스위치 나 해시지도 등을 사용하여 미리 설정된 명령을 실행하는 것이 훨씬 더 좋습니다. 존재하지 않는 "라벨"을 잡는 것도 중요하지 않습니다.

+0

제안에 감사드립니다. 그러나 이것은 내 질문에 대한 답변이 아니며 의견이어야한다고 생각합니다. –

+0

꽤 좋은 답변 TBH입니다. 모든 유효한 레이블 목록을 보관하십시오. 방금 읽은 목록이 목록에 없으면 자신이 선택한 proc을 호출하십시오. 문제를 정확하게 해결하고 부팅에 안전을 추가합니다. – ZoFreX