Provided by: manpages-zh_1.5.1-1_all bug

NAME

       interp - 建立和操縱 Tcl 解釋器

` SYNOPSIS
       interp option ?arg arg ...?
_________________________________________________________________

yz DESCRIPTION
       這茤R令建立一茤峖h虓s的           Tcl          解釋器,並使其與建立(它-
       怐)解釋器在相同的應用中共存。建立解釋器的解釋器叫做主解釋器(master)而新解釋器叫做從解釋器(slave)。主解釋器可以建立任意數目的從解釋器,每-
       荓q解釋器也可以自己建立增添的從解釋器而成為它怐漸D解釋器,這將導-
       P解釋器的一茧弁髒h次(hierarchy)。

       每虒挭擰僧蛫翵銗L解釋器是獨立的:
       它有給命令、過程、和全局變量的自己的名字空間。一-
       茈D解釋器可以使用叫別名(alias)的機制建立它的從解釋器與它自-
       間的連接。別名是在一荓q解釋器中的一茤R令,調用它時,導-
       P在它的主解釋器或其他從解釋器中調用一-
       茤R令。解釋器之間的唯一其他連接是通過環境變量(env  變量),它通常被在這-
       蚗野峇云漫狾雩挭擰髡@享。注意給檔案的名字空間(比如由
       open命令返回的名字)不在解釋器之間共享。提供顯式的命令來共享檔案和把到打開檔案的引用從一-
       虒挭擰嗽鉥(transfer)到另一荂C

       interp命令還提供對安全(safe)解釋器的支持。一茼w全解釋器是一茈能被嚴格-
       制了的從解釋器,這樣就可以執行不可信任的稿本而不用害怕它-
       抪棺a其他解釋器或這蚗野峈瑰藿牷C例如,安全解釋器不能訪問所有         IO
       通道建立命令和子過程建立命令。    詳情參見下悸    SAFE    INTERPRETERS |
       (安全的解釋器)       章節。未從安全的解釋器中去除有危險的弁遄F但是,它- |
       怓O隱藏的,所以只有可信任的解釋器可以獲得到它-                          |
       怐熙X問。隱藏命令的詳細解釋請參見下悸   HIDDEN   COMMANDS   (隱藏命令) |
       章節。可以使用別名機制來在從解釋器和它的主解釋器之間進行受保護的通信(類似於一-|
       荇痐蔇掍)。別名機制工作的詳情參見下悸        ALIAS         INVOCATION |
       (別名調用)章節。

       一茤w的(qualified)解釋器的名字是一蚞A當的     Tcl     列表,它包含在這-
       虒挭擰匱h次中它的祖先的一-
       茪l集,終結於以它的直接上級(immediate)主解釋器命名的字符串。解釋器名字是相對於在其中使用它的-
       虒挭擰鼓滿C例如,如果  a  是當前解釋器的一荓q解釋器並且它有一荓q解釋器
       a1,它依次有一荓q解釋器 a11,在aa11  的定的名字是列表 a1 a11。

       下探yz的            interp命令接受定的解釋器名字作為參數;命令在其中求-
       爾挭擰嘗`是可以作為
       {}來引用(空列表或字符串)。注意除了通過別名之外,在一-
       荓q解釋器中不可能通過名字引用一-
       茈D(祖先)解釋器。還有,沒有通過它可以引用在應用中建立的第一-
       虒挭擰鼓漸局名字。這兩種制的目的都是為了安全。

INTERPRO COMMAND                                                            |
       使用                                                             interp
       命令建立、刪除、和操縱從解釋器,並在解釋器之間共享或轉換通道。依賴於
       option 參數,它可以有下列一些形式:

       interp alias srcPath srcCmd
              返回一 Tcl 列表,它的元素是與叫做 srcCmd的別名有關的  targetCmdargs(在建立別名時指定所有這些-
              F在從解釋器中實際的源命令如果被咿R名的話可能與 srcCmd 不同)。

       interp alias srcPath srcCmd {}
              刪除在從解釋器中用  srcPath  標識的給   srcCmd    的別名。srcCmd
              引用在其下建立別名的名字;如果        源命令已經被咿R名,則刪除-
              咿R名後的命令。

       interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
              這茤R令在一荓q解釋器和其他解釋器之間建立一荍O名(關於在一-
              荓q解釋器和它的主解釋器之間建立別名請參見下悸             alias
              從命令)。在這茤R令中,兩荓q解釋器可以在調用這-
              茤R令的解釋器底下的解釋器層次中的任何位置。SrcPathsrcCmd
              標識這荍O名的來源。SrcPath   是一   Tcl   列表,它的元素選擇一-
              荅S定的解釋器。例如,「a  b」標識一虒挭擰 b,它是解釋器 a 的一-
              荓q解釋器,a解釋器是調用(命令)的解釋器的一荓q解釋器。一-
              茠臟C表指定調用這茤R令的解釋器。srcCmd給出一-
              虓s命令的名字,將在源解釋器中建立它。TargetPathtargetCmd
              指定一茈媦邽挭擰鼎M命令,和 arg   參數,如果有的話,給 targetCmd
              指定增補的參數,它怞b      srcCmd      調用中指定的所有參數的前-
              情CTargetCmd在這蚑掍峈漁-
              唹i以被取消定義(undefine)了,或者它已經存在了;它不由這-
              茤R令來建立。別名安排在源解釋器中調用給定源命令的時-
              啈b目標解釋器中調用給定目標命令。詳情參見下悸 ALIAS  INVOCATION
              (別名調用)章節。

       interp aliases ?path?
              這茤R令返回給在用                                           path
              表示的解釋器中定義的別名的所有源命令的名字一 Tcl 列表。

       interp create ?-safe? ?--? ?path?
              建立用 path   標識的一荓q解釋器和叫做從命令(slave  command)的一-
              虓s命令。從命令的名字是                         path的最後一茼-
              。在其中建立新的從解釋器和從命令的解釋器由從 path 中去除最後一-
              茼叔所獲得的路徑來標識。例如,如果   patha  b  c   則一-
              虓s的從解釋器和叫做       c的從命令建立在用路徑       a        b
              標識的從解釋器中。可以使用從命令先下探y-
              z的那樣操縱新解釋器。如果省略了   path,   Tcl   建立    interpx
              形式的一荌艉@的名字,這裏的                               x是一-
              蚞蒱A並用於解釋器和從命令。如果指定了
              -safe開關(或者主解釋器是一-
              茼w全解釋器),新的從解釋器將建立成弁鄏釭漱@-
              茼w全解釋器;否則從解釋器將包含  Tcl  內置命令和變量的全集。使用
              --  開關來標記開關的結束;如果路徑是像  -safe   這樣的一荅S殊的-
              漁尕需n這荈}關。這茤R令的結果是新解釋器的名字。一-
              荓q解釋器的名字在它的主解釋器的所有從解釋器中必須是唯一的;如果在這-
              茈D解釋器中用給定名字(標識)的一荓q解釋器已經存在則發生一蚇欞~。

       interp delete ?path ...?
              刪除用可選的      path     參數給出的零茤峖h虒挭擰飽A並且對於每-
              虒挭擰飽A它還刪除它的所有從解釋器。這茤R令還刪除給每-
              茬Q刪除的解釋器的從命令。對於每       path      參數,如果叫這-
              茼W字的解釋器不存在,這茼W字將引發一蚇欞~。

       interp eval path arg ?arg ...?
              這茤R令用與  concat命令相同的方式串聯所有的  arg  參數,接著在用
              path  標識的解釋器中把結果字符串作為一  Tcl 稿本來求C把這茖D-
              熊痕G(如果發生錯誤的話,包括像      errorInfoerrorCode
              變量這樣的錯誤訊息)返回給調用(命令)的解釋器。

       interp exists path
              如果在這茈D解釋器中存在用 path 指定的從解釋器則返回  1,否則返回
              0。如果省略了 path,使用調用(命令)的解釋器。

       interp expose path hiddenName                                           |
       ?exposedCmdName?                          |                             |
              在用    path   表示(denote)的解釋器中,使隱藏的命令   hiddenName |
              暴露(expose),最終把它帶回在一虓s的exposedCmdName                |
              名字之下(目前只接受沒有任何::                              的一- |
              茈局名字空間名字)。如果有目標名字的一蚍吇S的命令已經存在,這-   |
              茤R令失敗。隱藏命令的詳情參見下悸慵IDDEN                COMMANDS |
              (隱藏命令)章節。                                                 |

       interp hide path exposedCmdName                                         |
       ?hiddenCmdName?                         |                               |
              在用  path  表示(denote)的解釋器中,使暴露的命令  exposedCmdName |
              隱藏,並把它咿R名成隱藏命令            hiddenCmdName,如果未給出 |
              hiddenCmdName              則保持相同的名字。如果有目標名字的一- |
              蚆蘌礙漫R令已經存在,這茤R令失敗。目前     exposedCmdName     和 |
              hiddenCmdName二者不能不能包含名字空間定符,否則將引發一-         |
              蚇欞~。即使當前名字空間不是全局名字空間,仍在全局名字空間中查找- |
              n被                                                       interp |
              hide隱藏的命令。這防止從解釋器通過使當前的名字空間不同於全局名字空間(的方式),來愚弄主解釋器去隱藏錯誤的命令。隱藏命令的詳情參見下-|
              悸慵IDDEN COMMANDS (隱藏命令)章節。                              |

       interp hidden                                                           |
       path                                                      |             |
              返回在用 path  標識的解釋器中所有隱藏命令的名字的一茼C表。       |

       interp invokehidden path ?-global? hiddenCmdName ?arg                   |
       ...?              |                                                     |
              在由  path  表示的解釋器中用提供的參數調用隱藏命令 hiddenCmdName |
              。對參數不(進行)替換或求C如果存在                      -global |
              標誌,在目標解釋器的全局層次上調用隱藏命令;否則在當前的調用框架 |
              (frame)上調用它並且可以訪問調用框架內部和外部的局部變量。隱藏命令的詳情請參見下-|
              悸慵IDDEN COMMANDS (隱藏命令)章節。

       interp issafe ?path?
              如果由 path 指定的解釋器是安全的則返回 1,否則返回 0interp marktrusted                                                      |
       path                                                 |                  |
              標記用     path      標識的解釋器是可信任的。不暴露隱藏命令。這- |
              茤R令只能在可信任的解釋器中調用。如果由                          |
              path標識的解釋器已經是可信任的,則這茤R令沒有影響。

       interp share srcPath channelId destPath
              在用 srcPath   標識的解釋器和用  destPath  標識的解釋器之間導P用
              channelId標識的         IO        通道變成共享的。兩虒挭擰髡b這
              IO通道上由相同的權。兩虒挭擰馴眸溼鶶洛成蚚鶶洹C層的           IO
              通道;在銷毀一虒挭擰鼓漁尕自動關閉在這虒挭擰馱丰i訪問的       IO
              通道。

       interp slaves ?path?
              返回與用  path   標識的解釋器相關的所有從解釋器的名字的一   Tcl
              列表。如果省略了 path,使用調用(命令)的解釋器。

       interp target path alias
              返回描z給一荍O名的目標解釋器的一         Tcl        列表。用一-
              虒挭擰兢纁|和源命令名指定這荍O名,  就像在上悸   interp   alias
              中那樣。目標解釋器的名字被返回為相對於調用(命令)的解釋器的一-
              虒挭擰兢纁|。如果給這-
              荍O名的目標解釋器是調用(命令)的解釋器則返回一-
              茠臟C表。如果給別名的目標解釋器不是調用(命令)的解釋器或是它的後代之一則生成一-
              蚇欞~。在調用這茤R令的時唹媦虳R令不是必須定義的。

       interp transfer srcPath channelId destPath
              導P用     channelId      標識的     IO    通道,在用    destPath
              標識的解釋器中變成可獲得的,而在用                       srcPath
              標識的解釋器中變成不可獲得的。

SLAVERO COMMAND
       對於每茈       interp        建立的從解釋器,在主解釋器中建立名字與這-
       虓s解釋器相同的一虓s         Tcl         命令。可以使用這茤R令調用在這-
       虒挭擰馱W的各種操作。它有下悸漱@般形式:
              slave command ?arg arg ...?
       Slave     是解釋器的名字,commandargs確定這茤R令的具體行為。這-
       茤R令有效形式有:

       slave aliases
              返回一          Tcl          列表,它的元素是在           slave
              中的所有別名的名字。返回的名字是建立別名時使用的    srcCmd   的-
              (如果它怳w經被咿R名,則它可以同這茤R令的當前的名字不相同)。

       slave alias srcCmd
              返回一   Tcl   列表,它的元素是與叫做   srcCmd     的別名相關的
              targetCmdargs(在建立這荍O名的時圊定所有這些-
              F在從解釋器中的實際的源命令如果被咿R令則可能與 srcCmd不同)。

       slave alias srcCmd {}
              在從解釋器中刪除給            srcCmd              的別名。srcCmd
              參照在其下建立別名的那茼W字;如果源命令已經被咿R名,則刪除-
              咿R名後的命令。

       slave alias srcCmd targetCmd ?arg ..?
              建立一荍O名,當在slave 中調用  srcCmd   的時,  在主解釋器中調用
              targetCmd    。把    arg    參數作為補充的參數傳遞給   targetCmd
              ,這些參數在   srcCmd    的調用中傳遞的任何參數之前。詳情參見下-
              悸態LIAS INVOCATION (別名調用)章節。

       slave eval arg ?arg ..?
              這茤R令用與  concat  命令相同的方式串聯所有的  arg  參數,接著在
              slave     中把結果字符串作為一     Tcl      稿本來求C把這茖D-
              熊痕G(如果有錯誤發生,包括像     errorInfoerrorCode
              變量這樣的錯誤訊息)返回給調用(命令)的解釋器。

       slave expose hiddenName                                                 |
       ?exposedCmdName?                                |                       |
              這茤R令暴露在  slave  的隱藏的命令 hiddenName,最終把它帶回在一- |
              虓s的exposedCmdName      名字之下(目前只接受沒有任何::     的一- |
              茈局名字空間名字)。如果有目標名字的一蚍吇S的命令已經存在,這-   |
              茤R令失敗。隱藏命令的詳情參見下悸慵IDDEN                COMMANDS |
              (隱藏命令)章節。                                                 |

       slave hide exposedCmdName                                               |
       ?hiddenCmdName?                               |                         |
              這茤R令隱藏在從解釋器中暴露的命令        exposedCmdName,並把它- |
              咿R名成隱藏命令           hiddenCmdName,如果未給出hiddenCmdName |
              則保持相同的名字。如果有目標名字的一蚆蘌礙漫R令已經存在,這-     |
              茤R令失敗。目前                                 exposedCmdName和 |
              hiddenCmdName二者不能不能包含名字空間定符,否則將引發一-         |
              蚇欞~。即使當前名字空間不是全局名字空間,仍在全局名字空間中查找- |
              n被隱藏的命令。這防止從解釋器通過使當前的名字空間不同於全局名字空間(的方式),來愚弄主解釋器去隱藏錯誤的命令。隱藏命令的詳情參見下-|
              悸慵IDDEN COMMANDS (隱藏命令)章節。                              |

       slave                                                                   |
       hidden                                                            |     |
              返回在 slave 中所有隱藏的名字的一茼C表。                         |

       slave invokehidden ?-global hiddenName ?arg                             |
       ..?                         |                                           |
              這茤R令在           slave           中用提供的參數調用隱藏的命令 |
              hiddenName。對這些參數不進行求帤懂哄C如果給出了                |
              -global標誌,則在這荓q解釋器的全局層次上調用這-                  |
              茤R令;否則在當前調用框架上調用它並可訪問這-                     |
              蚑掍峸堿[內部或外部的局部變量。隱藏命令的詳情參見下悸慵IDDEN     |
              COMMANDS (隱藏命令)章節。

       slave issafe
              如果從解釋器是安全的則返回  1,否則返回 0slave                                                                   |
       marktrusted                                                       |     |
              標記從解釋器為可以信任的。只可以被可信任的解釋器調用。這-        |
              茤R令不暴露在這荓q解釋器中的任何隱含命令。如果這-                |
              茤R令已經是可以信任的了,則這茤R令沒有影響。

w SAFE INTERPRETERS
       一茼w全解釋器是一茈能受-
       制的解釋器,所以執行從最惡毒的敵人那裏來的任意稿本都是安全的而不用害怕這-
       蚑Z本毀壞包圍它的(enclosing)應用或你的p算環境的其餘部分。n使一-
       虒挭擰髡w全,n從這-
       虒挭擰馱之R除特定的命令和變量。例如,刪除在磁碟上建立檔案的命令,和刪除exec命令,因為它可通過子進程導-
       P破壞。通過建立到主解釋器的別名,它小心的檢查它怐滌捊繫ㄗ揤鼣]施的一-
       茼w全子集的受制的訪問,可以提供對這些設施的有的訪問。例如,在一-
       荅S定的子目錄中允鹿仵蚴堨腄A和允章鴷J細選擇的和一-
       茤T定的程式的集合的子進程調用。

       通過給 interp create 命令指定 -safe開關來建立一茼w全的解釋器。進而,一-
       茼w全解釋器建立的任何從解釋器都是安全的。

       建立的安全解釋器準確的有下列的內置的命令集:

              after       append      array       binary
              break       case        catch       clock
              close       concat      continue    eof
              error       eval        expr        fblocked
              fcopy       fileevent   flush       for
              foreach     format      gets        global
              history     if          incr        info
              interp      join        lappend     lindex
              linsert     list        llength     lrange
              lreplace    lsearch     lsort       namespace
              package     pid         proc        puts
              read        regexp      regsub      rename
              return      scan        seek        set
              split       string      subst       switch
              tell        trace       unset       update
              uplevel     upvar       variable    vwait
              while

       interp create  建立一茼w全解釋器時下列命令是隱藏的:                     |

              cd          exec        exit        fconfigure                   |
              file        glob        load        open                         |
              pwd         socket      source      vwait                        |

       以後這些命令可以作為     Tcl      過程或別名來奐s建立,或用      interp |
       expose暴露出來。

       除此之外,在一茼w全解釋器中不存在
       env變量,所以不能同其他解釋器共享環境變量。env
       變量可能造成一次安全冒險,因為使用者可能在某-
       蚗藿疻僆q中存儲敏感信息。例如,PGP  手冊建議在環境變量  PGPPASS  中存儲
       PGP          私有密鑰。讓不可信任代碼可以在安全解釋器中訪問這蚥僆q將招-
       P一次安全冒險。

       如果擴展被裝載到安全解釋器中,它怳]可以制它-
       怞菑v弁鄖荓ㄓㄕw全的命令。對擴展的安全性的管理的討論參見Safe-Tclload Tcl 命令的手冊條目。

OW ALIAS INVOCATION
       精心的設-
       p了別名機制,所以在安全的從解釋器中執行不可信任的稿本是安全的而別名的目標是一-
       茈i信任的主解釋器。最保証安全性的最-
       n的事情是確保從從解釋器傳遞到主解釋器的信息在主解釋器中永不被求-
       帤懂哄F如果這種情況發生了,它將開啟在從解釋器中的某-
       茖葩c的稿本來在主解釋器中調用任意函數,這將危及安全。

       當從解釋器中調用一荍O名的源(命令)的時唌A在分析這茤R令時進行常規的   Tcl
       替換。在源解釋器中完成這些替換,就像對在這-
       虒挭擰馱云瑤掍峈漕銗L命令一樣。源命令的命令過程接受它的參數並把它-
       抳P給這荍O名的   targetCmdargs   融合起來建立一虓s的參數數組。如果
       srcCmd的字是``srcCmd  arg1  arg2  ... argN'',則新的字集將是``targetCmd
       arg  arg  ...  arg  arg1  arg2  ...  argN''。這裏的  targetCmdargs
       是在建立別名的時埭ㄗ悛瘓。接著用
       TargetCmd來在目標解釋器中定位(locate)一-
       茤R令過程,並且用新的參數集來調用這-
       茤R令過程。如果在目標解釋器中沒有叫做     targetCmd     的命令則發生一-
       蚇欞~。在這茼r上不進行補充的替換:不通過常規的          Tcl          求-
       魖謘A直接調用目標命令過程。所以在每茼r上精確的進行一次替換:
       在分析建立這荍O名的命令的時埭懂              targetCmdargs,當在源解釋器中分析這荍O名的源命令的時埭懂 arg1 - argN。

       在安全解釋器中給別名寫     targetCmds      的時唌A給它的參數永遠不被求-
       帤懂型O非常-
       n的,因為這將提供一種逃逸機制,使從解釋器可以執行在主解釋器中的任意代碼。這將危及系統的安全。

RO HIDDEN COMMANDS                                                       |
       安全解釋器嚴囿漕謅F在其中執行的  Tcl 程式可獲得的弁遄C允酗ㄔi信任的 Tcl |
       程式訪問這些弁酮O不安全的,因為它怚i以在這-                             |
       蚗藿狺仇Q用於各種攻擊。但是,有時在安全解釋器的上下文中有使用危險的弁鄋漲X理需-|
       n。例如,有時一茧{式必須         source         到解釋器中。另一茖狺l是 |
       Tk,在這裏視窗被綁定到與一-                                             |
       荅S定解釋器關聯的視窗層次當中;一些潛在的危險函數,比如視窗管理,必須在這-|
       虒挭擰馱W下文中的那些視窗上進行。                                       |

       interp                                                  命令提供了對這- |
       荌暋D的一種RO形式的解決方案。不是從安全解釋器中整-                |
       茠漣R除危險的命令,而是隱藏這些命令,所以它旼雃邦鵀b這虒挭擰馱什鶡瑼   |
       Tcl     稿本是不可獲得的。但是,這茼w全解釋器的任何可信任的祖先可以使用 |
       interp                                                    invoke,在這- |
       茼w全解釋器的上下文中,調用這些隱藏命令。隱藏命令和暴露命令駐留在分開的名字空間中。在一-|
       虒挭擰馱丰i以定義叫相同名字的隱藏命令和暴露命令。                       |

       在別名調用期間,在主解釋器中調用的過程體中可以調用在從解釋器中的隱藏命令。例如,在一-|
       荓q解釋器中可以給   source    建立一荍O名。當在這荓q解釋器中調用它的時- |
       唌A調用在主解釋器中的一蚢L程來檢查這蚞犑@是否是允釭(比如,是否允陶o-   |
       荓q解釋器訪問的它n求source   的檔案)。接著這蚢L程在從解釋器中調用隱藏的 |
       source命令來實際裝載(source)這蚗仵蛌漱漁e。注意在從解釋器中存在來著兩-  |
       茈s source 的命令: 別名和隱藏命令。                                     |

       因為一茈D解釋器可以把調用一蚆蘌矇R令作為處理一-                         |
       荍O名調用的一部分,必須非常小心的避免對通過別名調用傳遞來的任何參數進行求-|
       C否則,惡意的從解釋器可以導P一茈i信任的代表它怢荌鶡璁M險的命令。這-   |
       茈D題的完整討論參見ALIAS   INVOCATION  (別名調用)章節。n避免這荌暋D,對 |
       interp invokehidden的參數不n進行替換或求C                             |

       不允釵w全解釋器調用它自-                                               |
       中或它後代中的隱藏命令。這防止安全從解釋器訪問在自角予峊-              |
       怐澈嵽N中的隱藏命令。                                                   |

       一茈i信任的解釋器可以使用  interp  exposeinterp   hide   來操縱一- |
       虒挭擰馱云瑭蘌矇R令的集合。interp      expose       命令把在用     path |
       標識的解釋器中一蚆蘌矇R令移動到暴露命令的集合中,在這蚢L程中可能-       |
       咿R名這茤R令。如果叫目標名字的一蚍吇S的命令已經存在,這-                |
       蚞犑@失敗。類似的,interp          hide            把在這虒挭擰馱云漱@- |
       蚍吇S命令移動到隱藏命令的集合中。不允釵w全解釋器在它自-                |
       中或它的後代中的隱藏命令和暴露命令的集合之間移動命令。                  |

       目前,隱藏命令的名字不能包含名字空間定符,並且在你可以隱藏它之前必須-   |
       漸把在一茼W字空間中的命令咿R令到全局名字空中。在全局名字空間中查找n被  |
       interp                                                             hide |
       隱藏的命令。這防止從解釋器通過使當前的名字空間不同於全局名字空間(的方式),來愚弄主解釋器去隱藏錯誤的命令。|

P CREDITS
       這蚞魖謚簼韞 Nathaniel Borenstein 和  Marshall  Rose  實現的  Safe-Tcl
       鴢活C

 SEE ALSO
       load(n), safe(n), Tcl_CreateSlave(3)

r KEYWORDS
       alias, master interpreter, safe interpreter, slave interpreter

[]
      Hhh

[]
       2001/10/09

m Linux manUpn:
       http://cmpp.linuxforum.net