Provided by: manpages-zh_1.5.2-1.1_all bug

NAME

       interp - 建立和操縱 Tcl 解釋器

總覽 SYNOPSIS

       interp option ?arg arg ...?
_________________________________________________________________

描述 DESCRIPTION

       這個命令建立一個或多個新的  Tcl 解釋器,並使其與建立(它們的)解釋器在相同的應用中共存。建立
       解釋器的解釋器叫做主解釋器(master)而新解釋器叫做從解釋器(slave)。主解釋器可以建立任意數目
       的從解釋器,每個從解釋器也可以自己建立增添的從解釋器而成為它們的主解釋器,這將導致解釋器的
       一個等級層次(hierarchy)。

       每個解釋器相對其他解釋器是獨立的: 它有給命令、過程、和全局變量的自己的名字空間。一個主解釋
       器可以使用叫別名(alias)的機制建立它的從解釋器與它自身間的連接。別名是在一個從解釋器中的一
       個命令,調用它時,導致在它的主解釋器或其他從解釋器中調用一個命令。解釋器之間的唯一其他連接
       是通過環境變量(env  變量),它通常被在這個應用中的所有解釋器共享。注意給檔案的名字空間(比如
       由 open命令返回的名字)不在解釋器之間共享。提供顯式的命令來共享檔案和把到打開檔案的引用從一
       個解釋器轉換(transfer)到另一個。

       interp命令還提供對安全(safe)解釋器的支持。一個安全解釋器是一個功能被嚴格限制了的從解釋
       器,這樣就可以執行不可信任的稿本而不用害怕它們毀壞其他解釋器或這個應用的環境。例如,安全解
       釋器不能訪問所有 IO  通道建立命令和子過程建立命令。 詳情參見下面的 SAFE INTERPRETERS (安全 │
       的解釋器) 章節。未從安全的解釋器中去除有危險的功能;但是,它們是隱藏的,所以只有可信任的解 │
       釋器可以獲得到它們的訪問。隱藏命令的詳細解釋請參見下面的  HIDDEN  COMMANDS  (隱藏命令)  章 │
       節。可以使用別名機制來在從解釋器和它的主解釋器之間進行受保護的通信(類似於一個核心調用)。別 │
       名機制工作的詳情參見下面的 ALIAS INVOCATION (別名調用)章節。

       一個限定的(qualified)解釋器的名字是一個適當的 Tcl 列表,它包含在這個解釋器層次中它的祖先的
       一個子集,終結於以它的直接上級(immediate)主解釋器命名的字符串。解釋器名字是相對於在其中使
       用它的哪個解釋器的。例如,如果 a 是當前解釋器的一個從解釋器並且它有一個從解釋器 a1,它依次
       有一個從解釋器 a11,在aa11  的限定的名字是列表 a1 a11。

       下面描述的 interp命令接受限定的解釋器名字作為參數;命令在其中求值的解釋器總是可以作為 {}來
       引用(空列表或字符串)。注意除了通過別名之外,在一個從解釋器中不可能通過名字引用一個主(祖
       先)解釋器。還有,沒有通過它可以引用在應用中建立的第一個解釋器的全局名字。這兩種限制的目的
       都是為了安全。

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

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

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

       interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
              這個命令在一個從解釋器和其他解釋器之間建立一個別名(關於在一個從解釋器和它的主解釋器
              之間建立別名請參見下面的  alias 從命令)。在這個命令中,兩個從解釋器可以在調用這個命
              令的解釋器底下的解釋器層次中的任何位置。SrcPathsrcCmd       標識這個別名的來
              源。SrcPath  是一個 Tcl 列表,它的元素選擇一個特定的解釋器。例如,「a b」標識一個解
              釋器 b,它是解釋器 a  的一個從解釋器,a解釋器是調用(命令)的解釋器的一個從解釋器。一
              個空列表指定調用這個命令的解釋器。srcCmd給出一個新命令的名字,將在源解釋器中建立
              它。TargetPathtargetCmd  指定一個目標解釋器和命令,和 arg   參數,如果有的話,給
              targetCmd 指定增補的參數,它們在 srcCmd 調用中指定的所有參數的前面。TargetCmd在這個
              調用的時候可以被取消定義(undefine)了,或者它已經存在了;它不由這個命令來建立。別名
              安排在源解釋器中調用給定源命令的時候在目標解釋器中調用給定目標命令。詳情參見下面的
              ALIAS INVOCATION (別名調用)章節。

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

       interp create ?-safe? ?--? ?path?
              建立用 path  標識的一個從解釋器和叫做從命令(slave  command)的一個新命令。從命令的名
              字是 path的最後一個成員。在其中建立新的從解釋器和從命令的解釋器由從 path 中去除最後
              一個成員所獲得的路徑來標識。例如,如果 patha b c  則一個新的從解釋器和叫做  c的
              從命令建立在用路徑  a  b 標識的從解釋器中。可以使用從命令先下面描述的那樣操縱新解釋
              器。如果省略了 path, Tcl 建立 interpx 形式的一個唯一的名字,這裏的 x是一個整數,並
              用於解釋器和從命令。如果指定了  -safe開關(或者主解釋器是一個安全解釋器),新的從解釋
              器將建立成功能有限的一個安全解釋器;否則從解釋器將包含   Tcl     內置命令和變量的全
              集。使用  -- 開關來標記開關的結束;如果路徑是像 -safe  這樣的一個特殊的值的時候需要
              這個開關。這個命令的結果是新解釋器的名字。一個從解釋器的名字在它的主解釋器的所有從
              解釋器中必須是唯一的;如果在這個主解釋器中用給定名字(標識)的一個從解釋器已經存在則
              發生一個錯誤。

       interp delete ?path ...?
              刪除用可選的 path  參數給出的零個或多個解釋器,並且對於每個解釋器,它還刪除它的所有
              從解釋器。這個命令還刪除給每個被刪除的解釋器的從命令。對於每個  path 參數,如果叫這
              個名字的解釋器不存在,這個名字將引發一個錯誤。

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

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

       interp expose path hiddenName ?exposedCmdName?                                             │
              在用 path 表示(denote)的解釋器中,使隱藏的命令 hiddenName  暴露(expose),最終把它帶 │
              回在一個新的exposedCmdName    名字之下(目前只接受沒有任何::    的一個全局名字空間名 │
              字)。如果有目標名字的一個暴露的命令已經存在,這個命令失敗。隱藏命令的詳情參見下面   │
              的HIDDEN COMMANDS (隱藏命令)章節。                                                  │

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

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

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

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

       interp share srcPath channelId destPath
              在用 srcPath  標識的解釋器和用 destPath 標識的解釋器之間導致用  channelId標識的  IO
              通道變成共享的。兩個解釋器在這個 IO通道上由相同的權限。兩個解釋器必須關閉它來關閉低
              層的 IO 通道;在銷毀一個解釋器的時候自動關閉在這個解釋器中可訪問的 IO 通道。

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

       interp target path alias
              返回描述給一個別名的目標解釋器的一個 Tcl 列表。用一個解釋器路徑和源命令名指定這個別
              名, 就像在上面的 interp alias 中那樣。目標解釋器的名字被返回為相對於調用(命令)的解
              釋器的一個解釋器路徑。如果給這個別名的目標解釋器是調用(命令)的解釋器則返回一個空列
              表。如果給別名的目標解釋器不是調用(命令)的解釋器或是它的後代之一則生成一個錯誤。在
              調用這個命令的時候目標命令不是必須定義的。

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

SLAVE 命令 COMMAND

       對於每個用 interp  建立的從解釋器,在主解釋器中建立名字與這個新解釋器相同的一個新  Tcl  命
       令。可以使用這個命令調用在這個解釋器上的各種操作。它有下面的一般形式:
              slave command ?arg arg ...?
       Slave  是解釋器的名字,commandargs確定這個命令的具體行為。這個命令有效形式有:

       slave aliases
              返回一個  Tcl 列表,它的元素是在 slave 中的所有別名的名字。返回的名字是建立別名時使
              用的 srcCmd 的值(如果它們已經被重命名,則它可以同這個命令的當前的名字不相同)。

       slave alias srcCmd
              返回一個 Tcl 列表,它的元素是與叫做 srcCmd  的別名相關的 targetCmdargs(在建立
              這個別名的時候指定所有這些值;在從解釋器中的實際的源命令如果被重命令則可能與
              srcCmd不同)。

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

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

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

       slave expose hiddenName ?exposedCmdName?                                                   │
              這個命令暴露在  slave 的隱藏的命令 hiddenName,最終把它帶回在一個新的exposedCmdName │
              名字之下(目前只接受沒有任何:: 的一個全局名字空間名字)。如果有目標名字的一個暴露的命 │
              令已經存在,這個命令失敗。隱藏命令的詳情參見下面的HIDDEN COMMANDS (隱藏命令)章節。  │

       slave hide exposedCmdName ?hiddenCmdName?                                                  │
              這個命令隱藏在從解釋器中暴露的命令           exposedCmdName,並把它重命名成隱藏命令 │
              hiddenCmdName,如果未給出hiddenCmdName 則保持相同的名字。如果有目標名字的一個隱藏的 │
              命令已經存在,這個命令失敗。目前 exposedCmdNamehiddenCmdName二者不能不能包含名字 │
              空間限定符,否則將引發一個錯誤。即使當前名字空間不是全局名字空間,仍在全局名字空間  │
              中查找要被隱藏的命令。這防止從解釋器通過使當前的名字空間不同於全局名字空間(的方     │
              式),來愚弄主解釋器去隱藏錯誤的命令。隱藏命令的詳情參見下面的HIDDEN COMMANDS  (隱藏 │
              命令)章節。                                                                         │

       slave hidden                                                                               │
              返回在 slave 中所有隱藏的名字的一個列表。                                           │

       slave invokehidden ?-global hiddenName ?arg ..?                                            │
              這個命令在  slave 中用提供的參數調用隱藏的命令 hiddenName。對這些參數不進行求值或替 │
              換。如果給出了  -global標誌,則在這個從解釋器的全局層次上調用這個命令;否則在當前調 │
              用框架上調用它並可訪問這個調用框架內部或外部的局部變量。隱藏命令的詳情參見下面      │
              的HIDDEN COMMANDS (隱藏命令)章節。

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

安全解釋器 SAFE INTERPRETERS

       一個安全解釋器是一個功能受限制的解釋器,所以執行從最惡毒的敵人那裏來的任意稿本都是安全的而
       不用害怕這個稿本毀壞包圍它的(enclosing)應用或你的計算環境的其餘部分。要使一個解釋器安
       全,要從這個解釋器中刪除特定的命令和變量。例如,刪除在磁碟上建立檔案的命令,和刪除exec命
       令,因為它可通過子進程導致破壞。通過建立到主解釋器的別名,它小心的檢查它們的參數並提供對設
       施的一個安全子集的受限制的訪問,可以提供對這些設施的有限的訪問。例如,在一個特定的子目錄中
       允許檔案建立,和允許對仔細選擇的和一個固定的程式的集合的子進程調用。

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

       建立的安全解釋器準確的有下列的內置的命令集:     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                     建立一個安全解釋器時下列命令是隱藏的: │
       cd          exec        exit        fconfigure    file        glob        load        openpwd         socket      source      vwait   以後這些命令可以作為   Tcl  過程或別名來重新建 │
       立,或用 interp expose暴露出來。

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

       如果擴展被裝載到安全解釋器中,它們也可以限制它們自己功能來排除不安全的命令。對擴展的安全性
       的管理的討論參見Safe-Tclload Tcl 命令的手冊條目。

別名調用 ALIAS INVOCATION

       精心的設計了別名機制,所以在安全的從解釋器中執行不可信任的稿本是安全的而別名的目標是一個可
       信任的主解釋器。最保証安全性的最重要的事情是確保從從解釋器傳遞到主解釋器的信息在主解釋器中
       永不被求值或替換;如果這種情況發生了,它將開啟在從解釋器中的某個邪惡的稿本來在主解釋器中調
       用任意函數,這將危及安全。

       當從解釋器中調用一個別名的源(命令)的時候,在分析這個命令時進行常規的  Tcl 替換。在源解釋器
       中完成這些替換,就像對在這個解釋器中的調用的其他命令一樣。源命令的命令過程接受它的參數並把
       它們與給這個別名的    targetCmdargs   融合起來建立一個新的參數數組。如果   srcCmd的字
       是``srcCmd arg1 arg2 ... argN'',則新的字集將是``targetCmd arg arg ... arg arg1  arg2  ...
       argN''。這裏的 targetCmdargs 是在建立別名的時候提供的值。接著用 TargetCmd來在目標解釋器
       中定位(locate)一個命令過程,並且用新的參數集來調用這個命令過程。如果在目標解釋器中沒有叫做
       targetCmd 的命令則發生一個錯誤。在這個字上不進行補充的替換:不通過常規的 Tcl 求值機制,直接
       調用目標命令過程。所以在每個字上精確的進行一次替換:     在分析建立這個別名的命令的時候替換
       targetCmdargs,當在源解釋器中分析這個別名的源命令的時候替換 arg1 - argN。

       在安全解釋器中給別名寫 targetCmds 的時候,給它的參數永遠不被求值或替換是非常重要的,因為這
       將提供一種逃逸機制,使從解釋器可以執行在主解釋器中的任意代碼。這將危及系統的安全。

隱藏命令 HIDDEN COMMANDS                                                                          │
       安全解釋器嚴重的限制了在其中執行的 Tcl 程式可獲得的功能。允許不可信任的 Tcl 程式訪問這些功 │
       能是不安全的,因為它們可以在這個環境中被用於各種攻擊。但是,有時在安全解釋器的上下文中有使 │
       用危險的功能的合理需要。例如,有時一個程式必須 source 到解釋器中。另一個例子是  Tk,在這裏 │
       視窗被綁定到與一個特定解釋器關聯的視窗層次當中;一些潛在的危險函數,比如視窗管理,必須在這 │
       個解釋器上下文中的那些視窗上進行。                                                         │

       interp  命令提供了對這個問題的一種隱藏命令形式的解決方案。不是從安全解釋器中整個的刪除危險 │
       的命令,而是隱藏這些命令,所以它們變成對在這個解釋器中執行的    Tcl   稿本是不可獲得的。但 │
       是,這個安全解釋器的任何可信任的祖先可以使用 interp invoke,在這個安全解釋器的上下文中,調 │
       用這些隱藏命令。隱藏命令和暴露命令駐留在分開的名字空間中。在一個解釋器中可以定義叫相同名字 │
       的隱藏命令和暴露命令。                                                                     │

       在別名調用期間,在主解釋器中調用的過程體中可以調用在從解釋器中的隱藏命令。例如,在一個從解 │
       釋器中可以給 source 建立一個別名。當在這個從解釋器中調用它的時候,調用在主解釋器中的一個過 │
       程來檢查這個操作是否是允許的(比如,是否允許這個從解釋器訪問的它要求source  的檔案)。接著這 │
       個過程在從解釋器中調用隱藏的  source命令來實際裝載(source)這個檔案的內容。注意在從解釋器中 │
       存在來著兩個叫 source 的命令: 別名和隱藏命令。                                             │

       因為一個主解釋器可以把調用一個隱藏命令作為處理一個別名調用的一部分,必須非常小心的避免對通 │
       過別名調用傳遞來的任何參數進行求值。否則,惡意的從解釋器可以導致一個可信任的代表它們來執行 │
       危險的命令。這個主題的完整討論參見ALIAS   INVOCATION    (別名調用)章節。要避免這個問題,對 │
       interp invokehidden的參數不要進行替換或求值。                                              │

       不允許安全解釋器調用它自身中或它後代中的隱藏命令。這防止安全從解釋器訪問在自身中或它們的後 │
       代中的隱藏命令。                                                                           │

       一個可信任的解釋器可以使用 interp exposeinterp  hide  來操縱一個解釋器中的隱藏命令的集 │
       合。interp  expose  命令把在用 path 標識的解釋器中一個隱藏命令移動到暴露命令的集合中,在這 │
       個過程中可能重命名這個命令。如果叫目標名字的一個暴露的命令已經存在,這個操作失敗。類似     │
       的,interp  hide  把在這個解釋器中的一個暴露命令移動到隱藏命令的集合中。不允許安全解釋器在 │
       它自身中或它的後代中的隱藏命令和暴露命令的集合之間移動命令。                               │

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

感謝 CREDITS

       這個機制基於由 Nathaniel Borenstein 和 Marshall Rose 實現的 Safe-Tcl 原型。

參見 SEE ALSO

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

關鍵字 KEYWORDS

       alias, master interpreter, safe interpreter, slave interpreter

[中文版維護人]

       寒蟬退士

[中文版最新更新]

       2001/10/09

《中國 Linux 論壇 man 手冊頁翻譯計劃》:

       http://cmpp.linuxforum.net