## Tcl8.6.17/Tk8.6.17 Documentation > Tcl Commands > interp

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    interp — Tcl 解釈実行機能の生成と操作 Create and manipulate Tcl interpreters
  構文 SYNOPSIS
  説明 DESCRIPTION
  interp 命令 THE INTERP COMMAND
    interp alias srcPath srcToken
    interp alias srcPath srcToken {}
    interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
    interp aliases ?path?
    interp bgerror path ?cmdPrefix?
    interp cancel ?-unwind? ?--? ?path? ?result?
    interp create ?-safe? ?--? ?path?
    interp debug path ?-frame ?bool??
    interp delete ?path ...?
    interp eval path arg ?arg ...?
    interp exists path
    interp expose path hiddenName ?exposedCmdName?
    interp hide path exposedCmdName ?hiddenCmdName?
    interp hidden path
    interp invokehidden path ?-option ...? hiddenCmdName ?arg ...?
    interp issafe ?path?
    interp limit path limitType ?-option? ?value ...?
    interp marktrusted path
    interp recursionlimit path ?newlimit?
    interp share srcPath channelId destPath
    interp slaves ?path?
    interp children ?path?
    interp target path alias
    interp transfer srcPath channelId destPath
  child COMMAND
    child aliases
    child alias srcToken
    child alias srcToken {}
    child alias srcCmd targetCmd ?arg ..?
    child bgerror ?cmdPrefix?
    child eval arg ?arg ..?
    child expose hiddenName ?exposedCmdName?
    child hide exposedCmdName ?hiddenCmdName?
    child hidden
    child invokehidden ?-option ...? hiddenName ?arg ..?
    child issafe
    child limit limitType ?-option? ?value ...?
    child marktrusted
    child recursionlimit ?newlimit?
  SAFE INTERPRETERS
  ALIAS INVOCATION
  HIDDEN COMMANDS
  RESOURCE LIMITS
  指示項目の制限 LIMIT OPTIONS
    -command
    -granularity
    -milliseconds
    -seconds
    -value
  BACKGROUND EXCEPTION HANDLING
  著作権表示 CREDITS
  用例 EXAMPLES
  SEE ALSO
  KEYWORDS

### NAME

interp — Tcl 解釈実行機能の生成と操作 Create and manipulate Tcl interpreters

### 構文 SYNOPSIS

interp subcommand ?arg arg ...?

### 説明 DESCRIPTION

この命令は､同じ応用譜の中で生成している解釈実行機能と共存する､一つ或はそれ以上の新しい Tcl 解釈実行機能を生成することを可能にする｡生成を行う側の解釈実行機能は親と呼ばれ､新しい解釈実行機能は仔供と呼ばれる｡親は幾つでも仔供を作成でき､それぞれの仔供そのものも､自身が親になるような追加的な仔供を生成でき､結果として解釈実行機能の階層構造になる｡ 　 This command makes it possible to create one or more new Tcl interpreters that co-exist with the creating interpreter in the same application. The creating interpreter is called the parent and the new interpreter is called a child. A parent can create any number of children, and each child can itself create additional children for which it is parent, resulting in a hierarchy of interpreters.

それぞれの解釈実行機能は､他からは独立している: それは､命令と､手続函数と､大域変数と､の為の自己の名前空間を有す｡ 親の解釈実行機能は alias と呼ばれる仕掛けを使って､仔供と自身との間の接続を生成できる｡ alias は､仔供の解釈実行機能の中の命令であって､起動される時に､その親の解釈実行機能内､又は他の仔供の解釈実行機能内で起動されるべき命令を発生させる｡解釈実行機能間の唯一の他の接続は環境変数( env 変数)を経由している､それらの変数は通常応用譜内の全ての解釈実行機能の間で共有され､又､源資によって超越した呼戻しを制限する｡註意すべきは､ファイルの為の名前空間(譬えば open 命令によって返される名前)はもはや解釈実行機能間では共有されていない｡ファイルを共有する為､それと､ファイルを開ける為の証明書を移転する為に､一つの解釈実行機能から別の解釈実行機能へ明示的な命令がもたらされる｡　　 Each interpreter is independent from the others: it has its own name space for commands, procedures, and global variables. A parent interpreter may create connections between its children and itself using a mechanism called an alias. An alias is a command in a child interpreter which, when invoked, causes a command to be invoked in its parent interpreter or in another child interpreter. The only other connections between interpreters are through environment variables (the env variable), which are normally shared among all interpreters in the application, and by resource limit exceeded callbacks. Note that the name space for files (such as the names returned by the open command) is no longer shared between interpreters. Explicit commands are provided to share files and to transfer references to open files from one interpreter to another.

この interp 命令は､ safe (安全)解釈実行機能の運用をももたらす｡安全解釈実行機能は仔供(従僕)で大きく機能制限されており､それにより他の解釈実行機能や､応用譜の環境に損害を与える恐れなしに､危険な記述譜を安全に実行する｡譬えば､全ての入出力通信路生成命令と､副手順生成命令は安全解釈実行機能からは利用できなくされている｡安全解釈実行機能にどの様な機能が備わっているかの更なる情報は下の SAFE INTERPRETERS を参照されたい｡危険な機能が安全解釈実行機能から､除去されているのではなく､代わりに､隠蔽されている､従って､信頼できる解釈実行機能のみが､それを利用できる｡隠蔽された命令の詳細の記述は下の､ HIDDEN COMMANDS を参照されたい｡別名の仕掛けも､親と仔供の解釈実行機能間の､保護された情報交換(OS核機能呼出しを模した)に使用可能である｡別名の仕掛けが如何に動作するかの詳細は下の ALIAS INVOCATION を参照されたい｡ The interp command also provides support for safe interpreters. A safe interpreter is a child whose functions have been greatly restricted, so that it is safe to execute untrusted scripts without fear of them damaging other interpreters or the application's environment. For example, all IO channel creation commands and subprocess creation commands are made inaccessible to safe interpreters. See SAFE INTERPRETERS below for more information on what features are present in a safe interpreter. The dangerous functionality is not removed from the safe interpreter; instead, it is hidden, so that only trusted interpreters can obtain access to it. For a detailed explanation of hidden commands, see HIDDEN COMMANDS, below. The alias mechanism can be used for protected communication (analogous to a kernel call) between a child interpreter and its parent. See ALIAS INVOCATION, below, for more details on how the alias mechanism works.

適正な解釈実行機能の名前は､解釈実行機能の階層構造内のその祖先の部分集合を含む適切な Tcl リストであって､その直接の親の解釈実行機能の文字列名で終る｡解釈実行機能の名前はそれが使用されている解釈実行機能に相対的である｡譬えば､ “a” が現在の解釈実行機能の子供でそれが子供 “a1” を有し､さらにそれが子供 “a11” を有すると､ “a” 内での “a11” の適正な名前はリスト “a1 a11” になる｡ A qualified interpreter name is a proper Tcl list containing a subset of its ancestors in the interpreter hierarchy, terminated by the string naming the interpreter in its immediate parent. Interpreter names are relative to the interpreter in which they are used. For example, if “a” is a child of the current interpreter and it has a child “a1”, which in turn has a child “a11”, the qualified name of “a11” in “a” is the list “a1 a11”.

この interp 命令は､下に記述するように､適正な解釈実行機能の名前を引数として受取る; その中で命令が起動されるような解釈実行機能は常に､ {} (空リスト､又は空文字列)として参照できる｡註意すべきは､仔供の解釈実行機能内から名前による親の解釈実行機能の参照は､別名を通す方法以外は､不可能である｡又､応用譜内で生成された最初の解釈実行機能を参照できる大域名もない｡この制限は二つとも､安全性への配慮により､課せられている｡ The interp command, described below, accepts qualified interpreter names as arguments; the interpreter in which the command is being evaluated can always be referred to as {} (the empty list or string). Note that it is impossible to refer to a parent (ancestor) interpreter by name in a child interpreter except through aliases. Also, there is no global name by which one can refer to the first interpreter created in an application. Both restrictions are motivated by safety concerns.

### interp 命令 THE INTERP COMMAND

この interp 命令は仔供の解釈実行機能の生成､消去､操作に使われ､解釈実行機能間の通信路を共有又は移転する｡副命令引数に依存する幾つかの形式がある: The interp command is used to create, delete, and manipulate child interpreters, and to share or transfer channels between interpreters. It can have any of several forms, depending on the subcommand argument:

interp alias srcPath srcToken
  要素が targetCmd と､ srcToken で表現される別名に対応している arg との､Tclリストを返す(これは､別名が生成されたときに返される値; 仔供の解釈実行機能内の源の命令の名前は srcToken からは異なっているかもしれない)｡ Returns a Tcl list whose elements are the targetCmd and args associated with the alias represented by srcToken (this is the value returned when the alias was created; it is possible that the name of the source command in the child is different from srcToken).

interp alias srcPath srcToken {}
  srcPath で識別される仔供の解釈実行機能内の srcToken の為の別名を消去する｡ srcToken は別名が作成されたときに戻ってくる値を参照する; もし､源の命令が改名されていると､改名された命令が消去される｡ Deletes the alias for srcToken in the child interpreter identified by srcPath. srcToken refers to the value returned when the alias was created; if the source command has been renamed, the renamed command will be deleted.

interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
  この命令は､一つの仔供と別の解釈実行機能の間の別名を作る(仔供と親の間の別名の生成については､下の alias slave 命令参照のこと)｡この命令の中で､どの仔供解釈実行機能もが､この命令を起動している解釈実行機能の下の解釈実行機能の階層構造のどこにでもなり得る｡ srcPath と srcCmd は別名の源を識別する｡ srcPath はTclのリストであって､その要素は特定の解釈実行機能を撰んでいる｡譬えば､ “a b” は､解釈実行機能 “b” を識別し､それは､解釈実行機能 “a” の仔であり､ それは又､起動している解釈実行機能の仔である｡空リストはこの命令を起動している解釈実行機能を指定する｡srcCmd は､新しい命令の名前を与え､源解釈実行機能内で生成される｡ targetPath と targetCmd は目標解釈実行機能と命令を指定し､arg 引数は､指定されていると targetCmd に対する追加的な引数であり､それは､srcCmd の起動内で規定された如何なる引数に対しても先に追加される｡targetCmd は､その呼び出し時に未定義かも又は既に存在するかもしれない; この命令で生成されたものではない｡その別名は与えた目標の解釈実行機能の中で起動される目標命令の為に手配をする､何時でも､与えられた源命令は源解釈実行機能内で起動される｡更なる詳細は下の ALIAS INVOCATION を参照されたい｡この命令は token を返す､それは､たとえ命令が後から改名されても､作成した命令 srcCmd を混同なく識別する｡これまでは token は srcCmd と等しくは無かったが､等しくなりうる｡ This command creates an alias between one child and another (see the alias child command below for creating aliases between a child and its parent). In this command, either of the child interpreters may be anywhere in the hierarchy of interpreters under the interpreter invoking the command. SrcPath and srcCmd identify the source of the alias. SrcPath is a Tcl list whose elements select a particular interpreter. For example, “a b” identifies an interpreter “b”, which is a child of interpreter “a”, which is a child of the invoking interpreter. An empty list specifies the interpreter invoking the command. srcCmd gives the name of a new command, which will be created in the source interpreter. TargetPath and targetCmd specify a target interpreter and command, and the arg arguments, if any, specify additional arguments to targetCmd which are prepended to any arguments specified in the invocation of srcCmd. TargetCmd may be undefined at the time of this call, or it may already exist; it is not created by this command. The alias arranges for the given target command to be invoked in the target interpreter whenever the given source command is invoked in the source interpreter. See ALIAS INVOCATION below for more details. The command returns a token that uniquely identifies the command created srcCmd, even if the command is renamed afterwards. The token may but does not have to be equal to srcCmd.

interp aliases ?path?
  この命令は､ path で識別される解釈実行機能内で定義される別名の為の全ての源の命令のtoken のTclリストを返す｡別名が作成された時の､値に対応する token が返る(それは､命令の現在の名前とは同じではないかもしれない)｡ This command returns a Tcl list of the tokens of all the source commands for aliases defined in the interpreter identified by path. The tokens correspond to the values returned when the aliases were created (which may not be the same as the current names of the commands).

interp bgerror path ?cmdPrefix?
  この命令は､現在の背景処理の､ path で識別される解釈実行機能の為の､不具合処理機能子を得るか設定するかする｡もし､ cmdPrefix が存在しないと､現在の背景処理の不具合処理機能子が返り､もし､指定されていると､それは､語のリスト(最小の長さのもの)であって､解釈実行機能の背景の例外処理機能子を如何に設定するべきかを記述している｡更なる詳細は BACKGROUND EXCEPTION HANDLING の項を参照されたい｡ This command either gets or sets the current background exception handler for the interpreter identified by path. If cmdPrefix is absent, the current background exception handler is returned, and if it is present, it is a list of words (of minimum length one) that describes what to set the interpreter's background exception handler to. See the BACKGROUND EXCEPTION HANDLING section for more details.

interp cancel ?-unwind? ?--? ?path? ?result?
  path によって識別される解釈実行機能内で評価される記述譜を取消す｡ -unwind 指示項目なしで､解釈実行機能の為の評価棚は包んでいる捕捉命令が現れるか呼出し棚内に残った解釈実行機能の起動がなくなる迄､巻き戻される｡ -unwind 指示項目付きで､解釈実行機能の評価棚はどの様な介在する捕捉命令も考慮することなく呼出し棚上に残った解釈実行機能の更なる起動なしに巻き戻されない｡ -- 指示項目は､指示項目の終わりの印に使える; これは path が -safe の様な普通でない様な値の時に必要である｡もし result が存在すると､不都合伝言文文字列として使われる､それ以外の場合､省略時設定の不都合伝言文文字列が使用される｡ Cancels the script being evaluated in the interpreter identified by path. Without the -unwind switch the evaluation stack for the interpreter is unwound until an enclosing catch command is found or there are no further invocations of the interpreter left on the call stack. With the -unwind switch the evaluation stack for the interpreter is unwound without regard to any intervening catch command until there are no further invocations of the interpreter left on the call stack. The -- switch can be used to mark the end of switches; it may be needed if path is an unusual value such as -safe. If result is present, it will be used as the error message string; otherwise, a default error message string will be used.

interp create ?-safe? ?--? ?path?
  path で識別される仔供解釈実行機能と､ slave command と呼ばれる新しい命令を生成する｡仔供の命令の名前は path の最後の構成要素である｡新しい仔供解釈実行機能と仔供の命令は､ path から最後の構成要素を外して得られる経路で識別される解釈実行機能内に生成される｡譬えば､ path が a b c であると､名前が c の新しい仔供解釈実行機能と仔供命令が､経路 a b で識別される解釈実行機能内に生成される｡下で述べるようにその仔供命令は新しい解釈実行機能を操作する為に使用してもよい｡もし､path が省略されると､Tcl は､ interpx の形式の他と重複しない名前を生成する､ここで x は整数で､解釈実行機能と仔供命令の為に使っている｡もし､ -safe 指示項目が指定されると(又は､もし親解釈実行機能が安全な解釈実行機能であると)､新しい仔供解釈実行機能は安全な解釈実行機能として機能が制限されて生成される; そうでない場合は､仔供はTcl の組込み命令と変数の一式全てを全て含むことになる｡ -- 指示項目は指示項目の終わりの印として使われる; これは､もし､ path が -safe の様な特殊な値の場合に必要になる｡この命令の結果は､新しい解釈実行機能の名前である｡仔供解釈実行機能の名前は､その親の中のどの仔供とも重複してはならない; もし､その親の下に与えられた名前の仔供解釈実行機能が既に実在すると､不具合が生じる｡仔供解釈実行機能の最初の再帰の限度は､その親の解釈実行機能の､現在の再帰の限度に設定される｡ Creates a child interpreter identified by path and a new command, called a child command. The name of the child command is the last component of path. The new child interpreter and the child command are created in the interpreter identified by the path obtained by removing the last component from path. For example, if path is a b c then a new child interpreter and child command named c are created in the interpreter identified by the path a b. The child command may be used to manipulate the new interpreter as described below. If path is omitted, Tcl creates a unique name of the form interp x, where x is an integer, and uses it for the interpreter and the child command. If the -safe switch is specified (or if the parent interpreter is a safe interpreter), the new child interpreter will be created as a safe interpreter with limited functionality; otherwise the child will include the full set of Tcl built-in commands and variables. The -- switch can be used to mark the end of switches; it may be needed if path is an unusual value such as -safe. The result of the command is the name of the new interpreter. The name of a child interpreter must be unique among all the children for its parent; an error occurs if a child interpreter by the given name already exists in this parent. The initial recursion limit of the child interpreter is set to the current recursion limit of its parent interpreter.

interp debug path ?-frame ?bool??
  枠-水準の棚の情報が path で認識される仔供解釈実行機能内で捕捉されるかを制御する｡もし､引数が全く与えられないと､指示項目と現在の設定が返って来る｡もし､ -frame が与えられると､瑕疵修理の設定が､与えられた論理値名に設定され､現在の設定が返って来る｡これは､ info frame の出力にのみ効果を及ぼし､バイト命令水準の命令の起動のための､正確な枠-水準の情報は､単にこの設定の上で捕捉される｡ Controls whether frame-level stack information is captured in the child interpreter identified by path. If no arguments are given, option and current setting are returned. If -frame is given, the debug setting is set to the given boolean if provided and the current setting is returned. This only affects the output of info frame, in that exact frame-level information for command invocation at the bytecode level is only captured with this setting on.

  譬えば､この様な符号命令では For example, with code like

      proc mycontrol {... script} {
        ...
        uplevel 1 $script
        ...
      }

      proc dosomething {...} {
        ...
        mycontrol {
          somecode
        }
      }

  標準設定は命令 somecode のための相対的行番号をもたらし､適切な枠は eval の型になるであろう｡他方の側の枠-不都合修理活性によって､追跡は系がファイルと命令の絶対行番号を決定できるまでに拡張され､枠の source の型を返す｡この更なる正確な情報は､全ての命令の実行が遅くなるとの代償が支払われる｡ the standard setting will provide a relative line number for the command somecode and the relevant frame will be of type eval. With frame-debug active on the other hand the tracking extends so far that the system will be able to determine the file and absolute line number of this command, and return a frame of type source. This more exact information is paid for with slower execution of all commands.

  註意すべきは､一度それが設定されると､この旗印は断に戻せない: その様な試みは報告なしに無視される｡これは基礎になっている解釈実行機能の状態の一貫性の維持の為に必要とされる｡ Note that once it is on, this flag cannot be switched back off: such attempts are silently ignored. This is needed to maintain the consistency of the underlying interpreter's state.

interp delete ?path ...?
  指示項目の path 引数として与えられた零又はそれ以上の解釈実行機能を消去する｡この命令は､消去された解釈実行機能の仔供の命令も消去する｡それぞれの path 引数は､もしその名前の解釈実行機能が実在しないなら､この命令は不具合を発する｡ Deletes zero or more interpreters given by the optional path arguments, and for each interpreter, it also deletes its children. The command also deletes the child command for each interpreter deleted. For each path argument, if no interpreter by that name exists, the command raises an error.

interp eval path arg ?arg ...?
  この命令は全ての arg 引数を concat 命令と同じやり方で連結し､次に､できた文字列を path で識別される仔供の解釈実行機能内でTcl 記述譜として評価する｡この評価の結果は(全ての return 指示項目を含み､もし不具合が生じた時の -errorinfo と -errorcode 情報迄も含む)､起動された解釈実行機能に戻される｡註意すべきは､その記述譜は path の解釈実行機能の棚の枠の現在の文脈内で実行される; それ故､仔供の解釈実行機能内の別名の(親解釈実行機能内の)実現は､仔供の中の記述譜を実行することができ､仔供の現在の状態と棚の枠に関する情報を見付けることができる｡ This command concatenates all of the arg arguments in the same fashion as the concat command, then evaluates the resulting string as a Tcl script in the child interpreter identified by path. The result of this evaluation (including all return options, such as -errorinfo and -errorcode information, if an error occurs) is returned to the invoking interpreter. Note that the script will be executed in the current context stack frame of the path interpreter; this is so that the implementations (in a parent interpreter) of aliases in a child interpreter can execute scripts in the child that find out information about the child's current state and stack frame.

interp exists path
  path で指定される子供の解釈実行機能がこの親の中に実在すれば 1､そうでなければ 0 を返す｡もし path が省略されると起動されている解釈実行機能が使用される｡ Returns 1 if a child interpreter by the specified path exists in this parent, 0 otherwise. If path is omitted, the invoking interpreter is used.

interp expose path hiddenName ?exposedCmdName?
  path で表示された解釈実行機能内で､隠蔽された命令 hiddenName を顕示させ､最後には､新しい名前 exposedCmdName (その名前は､現在正規の大域変数名前空間の名前であって､如何なる:: を含まないもののみ受入れられる)のもとに運び込む｡もし､目標の名前を有する顕示された命令が既に存在する場合はこの命令は失敗する｡隠蔽された命令は､下の､HIDDEN COMMANDS に更なる詳細が説明されている｡ Makes the hidden command hiddenName exposed, eventually bringing it back under a new exposedCmdName name (this name is currently accepted only if it is a valid global name space name without any ::), in the interpreter denoted by path. If an exposed command with the targeted name already exists, this command fails. Hidden commands are explained in more detail in HIDDEN COMMANDS, below.

interp hide path exposedCmdName ?hiddenCmdName?
  path で表示された解釈実行機能内で､顕示された命令 exposedCmdName を隠蔽し､それを､隠蔽された命令 hiddenCmdName に名前変更するか､もし hiddenCmdName が与えられない場合は同じ名前を維持する｡もし､目標の名前を有する隠蔽された命令が既に実在する場合はこの命令は失敗する｡現在､exposedCmdName と hiddenCmdName は共に､名前空間の､修飾を含むことができず､不都合が発生する｡ interp hide により隠蔽される命令は､縦え､現在の名前空間が大域のものでなくとも､大域名前空間内で調べられる｡これは､現在の名前空間を大域のものと異なるものにさせることにより､仔供解釈実行機能が親解釈実行機能を騙して悪い命令を隠蔽する､ことを防いでいる｡隠蔽された命令の更なる詳細は下の HIDDEN COMMANDS に説明されている｡ Makes the exposed command exposedCmdName hidden, renaming it to the hidden command hiddenCmdName, or keeping the same name if hiddenCmdName is not given, in the interpreter denoted by path. If a hidden command with the targeted name already exists, this command fails. Currently both exposedCmdName and hiddenCmdName can not contain namespace qualifiers, or an error is raised. Commands to be hidden by interp hide are looked up in the global namespace even if the current namespace is not the global one. This prevents children from fooling a parent interpreter into hiding the wrong command, by making the current namespace be different from the global one. Hidden commands are explained in more detail in HIDDEN COMMANDS, below.

interp hidden path
  path で識別される解釈実行機能内の全ての隠蔽された命令のリストを返す｡ Returns a list of the names of all hidden commands in the interpreter identified by path.

interp invokehidden path ?-option ...? hiddenCmdName ?arg ...?
  path で表示された解釈実行機能内で､引数 hiddenCmdName で与えられた隠蔽命令を起動する｡引数には置換も評価も適用されない｡三つの -options が運用されていて､全て - で始まる: -namespace (それは､後ろに一つの引数 nsName を採る)､と -global と -- である｡もし､この -namespace 旗標があると､あの隠蔽された命令は､目標解釈実行機能内で､ nsName と呼ばれる名前空間内で起動される｡もし､ -global 旗標があると､あの隠蔽された命令は､目標解釈実行機能内で､大域水準で起動される; それ以外の場合は､現在呼んだ枠で起動され､そこの中とそのそとの呼び出し枠内の局所変数を利用できる｡ -- 旗標は hiddenCmdName が文字 “-” で始まることを許容し､それ以外には必要ない｡もし､ -namespace と -global 旗標の両方が存在すると､ -namespace 旗標は無視される｡註意すべきは､あの隠蔽された命令は path 解釈実行機能の現在の文脈棚の枠内で実行される様になる(省略時設定として)｡隠蔽された命令はの更なる詳細は下の HIDDEN COMMANDS に説明されている｡ Invokes the hidden command hiddenCmdName with the arguments supplied in the interpreter denoted by path. No substitutions or evaluation are applied to the arguments. Three -options are supported, all of which start with -: -namespace (which takes a single argument afterwards, nsName), -global, and --. If the -namespace flag is present, the hidden command is invoked in the namespace called nsName in the target interpreter. If the -global flag is present, the hidden command is invoked at the global level in the target interpreter; otherwise it is invoked at the current call frame and can access local variables in that and outer call frames. The -- flag allows the hiddenCmdName argument to start with a “-” character, and is otherwise unnecessary. If both the -namespace and -global flags are present, the -namespace flag is ignored. Note that the hidden command will be executed (by default) in the current context stack frame of the path interpreter. Hidden commands are explained in more detail in HIDDEN COMMANDS, below.

interp issafe ?path?
  解釈実行機能が指定された path が安全であれば 1 ､そうでなければ 0 を返す｡ Returns 1 if the interpreter identified by the specified path is safe, 0 otherwise.

interp limit path limitType ?-option? ?value ...?
  path で表示された解釈実行機能の為の､源資の限界 limitType の構成設定ついて､設定､操作､問合せをする｡ -option が全く指定されていないと､現在の限界の構成設定が返って来る｡もし､ -option だけの引数であると､その指示項目の値が返ります｡そうでない場合､ -option/value のリストの引数対を与えなければならない｡限界と指示項目を如何に与えるかについて更なる詳細は下の RESOURCE LIMITS を参照されたい｡ Sets up, manipulates and queries the configuration of the resource limit limitType for the interpreter denoted by path. If no -option is specified, return the current configuration of the limit. If -option is the sole argument, return the value of that option. Otherwise, a list of -option/value argument pairs must supplied. See RESOURCE LIMITS below for a more detailed explanation of what limits and options are supported.

interp marktrusted path
  path で識別される解釈実行機能に信頼良の印をつける｡隠蔽されている命令は触れさせない｡この命令は信頼良の印の解釈実行機能からのみ起動できる｡この命令は､ path で識別できる解釈実行機能に既に信頼良の印が付いていると効果はない｡ Marks the interpreter identified by path as trusted. Does not expose the hidden commands. This command can only be invoked from a trusted interpreter. The command has no effect if the interpreter identified by path is already trusted.

interp recursionlimit path ?newlimit?
  path で識別される解釈実行機能について､最大許容入れ子深さを返す｡もし､ newlimit が指定されていると､その解釈実行機能内の､ newlimit を超える Tcl_Eval と､それに関連した手続函数への､呼出しの入れ子が不都合を返すように解釈実行機能の入れ子限度が設定される｡その newlimit の値も返される｡newlimit の値は､正の整数であって､1 と､非長精度整数のそのOSでの最大値との間の値でなければならない｡ Returns the maximum allowable nesting depth for the interpreter specified by path. If newlimit is specified, the interpreter recursion limit will be set so that nesting of more than newlimit calls to Tcl_Eval and related procedures in that interpreter will return an error. The newlimit value is also returned. The newlimit value must be a positive integer between 1 and the maximum value of a non-long integer on the platform.

  この命令は Tcl 呼出し棚の最大の寸法のみを設定する｡それ自身では､その応用譜に使用される C 言語の棚の溢れを防げない｡もし､使用している計算機がC言語の棚の寸法の限界を有していると､この命令で設定した限界に到達する前に棚の溢れに遭遇するかもしれない｡もし､そうなると､C言語の棚の寸法を増加する為の､今のシステムの仕組みが備わっているかを調べられたい｡ The command sets the maximum size of the Tcl call stack only. It cannot by itself prevent stack overflows on the C stack being used by the application. If your machine has a limit on the size of the C stack, you may get stack overflows before reaching the limit set by the command. If this happens, see if there is a mechanism in your system for increasing the maximum size of the C stack.

interp share srcPath channelId destPath
  channelId によって識別される入出力通信路を､ srcPath によって識別される､解釈実行機能と destPath によって識別される､解釈実行機能とで共有するようにする｡両方の解釈実行機能は､その入出力通信路上に同じ許容度を有する｡両方の解釈実行機能は､基礎の入出力通信路を閉じる為にそれを閉じる必要がある; 解釈実行機能内の受入れられる入出力通信路は解釈実行機能内が破壊された時には自動的に閉じられる｡ Causes the IO channel identified by channelId to become shared between the interpreter identified by srcPath and the interpreter identified by destPath. Both interpreters have the same permissions on the IO channel. Both interpreters must close it to close the underlying IO channel; IO channels accessible in an interpreter are automatically closed when an interpreter is destroyed.

interp slaves ?path?
  path で識別される解釈実行機能に対応する仔供の解釈実行機能の名前のTcl リストを返す｡もし path が省略されると､起動している解釈実行機能が使用される｡ Returns a Tcl list of the names of all the child interpreters associated with the interpreter identified by path. If path is omitted, the invoking interpreter is used.

interp children ?path?
  interp slaves ?path? の類義語 Synonym for . interp slaves ?path?

interp target path alias
  別名の為の目標の解釈実行機能を記述しているTclリストを返す｡その別名は､丁度上の interp alias 内と同じ様に､解釈実行機能 path と源の命令の名前で指定される｡目標の解釈実行機能の名前は､起動している解釈実行機能に相対的な､解釈実行機能の経路として返って来る｡もし､その別名に対する目標の解釈実行機能が､起動している解釈実行機能であると､空リストが返って来る｡もし､その別名に対する目標の解釈実行機能が､起動している解釈実行機能でないか､その仔供の内の一つであると不具合が生成される｡目標の命令はこの起動の時点では定義されていない｡ Returns a Tcl list describing the target interpreter for an alias. The alias is specified with an interpreter path and source command name, just as in interp alias above. The name of the target interpreter is returned as an interpreter path, relative to the invoking interpreter. If the target interpreter for the alias is the invoking interpreter then an empty list is returned. If the target interpreter for the alias is not the invoking interpreter or one of its descendants then an error is generated. The target command does not have to be defined at the time of this invocation.

interp transfer srcPath channelId destPath
  channelId で識別される入出力通信路が destPath で識別される解釈実行機能内で利用可能になり､srcPath で識別される解釈実行機能内で利用できなくなる｡ Causes the IO channel identified by channelId to become available in the interpreter identified by destPath and unavailable in the interpreter identified by srcPath.

### child COMMAND

それぞれの子供の解釈実行機能は､この interp 命令で生成され､新しいTcl 命令は親の解釈実行機能内で､新しい解釈実行機能のものと､同じ名前で生成する｡この命令は解釈実行機能上の種々の操作を起動するために使用できる｡次の一般式を有する: For each child interpreter created with the interp command, a new Tcl command is created in the parent interpreter with the same name as the new interpreter. This command may be used to invoke various operations on the interpreter. It has the following general form:

    child command ?arg arg ...?

child は､解釈実行機能の名前で､ command と arg はこの命令の正確な振舞いを定める｡この命令の有効な形式は: child is the name of the interpreter, and command and the args determine the exact behavior of the command. The valid forms of this command are:

child aliases
  その要素が child 中の､全ての別名の tokens であるTclリストを返す｡その tokens は別名が創造された時に返ってきた値に対応する(それは､現在の命令の名前と同じではないかもしれない)｡ Returns a Tcl list whose elements are the tokens of all the aliases in child. The tokens correspond to the values returned when the aliases were created (which may not be the same as the current names of the commands).

child alias srcToken
  その要素が targetCmd と､srcToken で表現される別名に関連する arg であるTclリストを返す(それは､別名が創造された時に返ってきた値に対応する; 子供の中の､現実の源の命令は srcToken とは同じではないかもしれない )｡ Returns a Tcl list whose elements are the targetCmd and args associated with the alias represented by srcToken (this is the value returned when the alias was created; it is possible that the actual source command in the child is different from srcToken).

child alias srcToken {}
  子供の解釈実行機能内の srcToken の為の別名を消去する｡ srcToken は､別名が創造された時に返ってきた値を参照する; もし源の命令が名前変更されていると､変更された名前の命令が消去される｡ Deletes the alias for srcToken in the child interpreter. srcToken refers to the value returned when the alias was created; if the source command has been renamed, the renamed command will be deleted.

child alias srcCmd targetCmd ?arg ..?
  child 内で srcCmd が起動された時は何時でも､親の中で targetCmd が起動されている様な別名を創造する｡この arg 引数は targetCmd に追加の引数として､srcCmd の起動の中で引渡される何れの引数よりも､前置きされて､引渡される｡詳細は下の ALIAS INVOCATION を参照されたい｡この命令は､たとえ､その命令が後程名前変更されていても､創造された命令 srcCmd を混同なく識別できる token を返す｡その token は現在はとも角､以前は srcCmd と等しくはなかった｡ Creates an alias such that whenever srcCmd is invoked in child, targetCmd is invoked in the parent. The arg arguments will be passed to targetCmd as additional arguments, prepended before any arguments passed in the invocation of srcCmd. See ALIAS INVOCATION below for details. The command returns a token that uniquely identifies the command created srcCmd, even if the command is renamed afterwards. The token may but does not have to be equal to srcCmd.

child bgerror ?cmdPrefix?
  この命令は､子供の解釈実行機能について､現在の背景処理の不具合処理子を返す｡もし､ cmdPrefix が存在しないと､現在の背景処理の不具合処理機能子が返り､もし､指定されていると､それは､語のリスト(最小の長さのもの)であって､解釈実行機能の背景処理の不具合を如何に設定するかを記述している｡更なる詳細は BACKGROUND EXCEPTION HANDLING の項を参照されたい｡ This command either gets or sets the current background exception handler for the child interpreter. If cmdPrefix is absent, the current background exception handler is returned, and if it is present, it is a list of words (of minimum length one) that describes what to set the interpreter's background exception handler to. See the BACKGROUND EXCEPTION HANDLING section for more details.

child eval arg ?arg ..?
  この命令は全ての arg 引数を concat 命令と同じやり方で連結し､次に､できた文字列を仔供の解釈実行機能内でTcl 記述譜として評価する｡この評価の結果は(全ての return 指示項目を含み､もし不具合が生じた時の -errorinfo と -errorcode 情報迄も含む)､起動された解釈実行機能に戻される｡註意すべきは､その記述譜は slave の棚の枠の現在の文脈内で実行される; それ故､仔供の解釈実行機能内の別名の(親解釈実行機能内の)実現は､仔供の中の記述譜を実行することができ､仔供の現在の状態と棚の枠に関する情報を見付けることができる｡ This command concatenates all of the arg arguments in the same fashion as the concat command, then evaluates the resulting string as a Tcl script in child. The result of this evaluation (including all return options, such as -errorinfo and -errorcode information, if an error occurs) is returned to the invoking interpreter. Note that the script will be executed in the current context stack frame of child; this is so that the implementations (in a parent interpreter) of aliases in a child interpreter can execute scripts in the child that find out information about the child's current state and stack frame.

child expose hiddenName ?exposedCmdName?
  この命令は child 解釈実行機能内で､隠蔽された命令 hiddenName を顕示させ､最後には､新しい名前 exposedCmdName (その名前は､現在正規の大域変数名前空間の名前であって､如何なる :: を含まないもののみ受入れられる)のもとに運び込む｡もし､目標の名前を有する顕示された命令が既に存在する場合はこの命令は失敗する｡隠蔽された命令は､下の､HIDDEN COMMANDS を参照されたい｡ This command exposes the hidden command hiddenName, eventually bringing it back under a new exposedCmdName name (this name is currently accepted only if it is a valid global name space name without any ::), in child. If an exposed command with the targeted name already exists, this command fails. For more details on hidden commands, see HIDDEN COMMANDS, below.

child hide exposedCmdName ?hiddenCmdName?
  この命令は child の解釈実行機能内で､顕示された命令 exposedCmdName を隠蔽し､それを､隠蔽された命令hiddenCmdName に名前変更するか､もしhiddenCmdName が与えられない場合は child の解釈実行機能内で､同じ名前を維持する｡もし､目標の名前を有する隠蔽された命令が既に存在する場合はこの命令は失敗する｡現在､exposedCmdName と hiddenCmdName は共に､名前空間の､修飾を含むことができず､不都合が発生する｡ 隠蔽されるべき命令は､たとえ､現在の名前空間が大域のものでなくとも､大域名前空間内で調べられる｡これは､現在の名前空間を大域のものと異なるものにさせることにより､仔供解釈実行機能が親解釈実行機能を騙して悪い命令を隠蔽する､ことを防いでいます｡隠蔽された命令の更なる詳細は下の HIDDEN COMMANDS を参照されたい｡ This command hides the exposed command exposedCmdName, renaming it to the hidden command hiddenCmdName, or keeping the same name if the argument is not given, in the child interpreter. If a hidden command with the targeted name already exists, this command fails. Currently both exposedCmdName and hiddenCmdName can not contain namespace qualifiers, or an error is raised. Commands to be hidden are looked up in the global namespace even if the current namespace is not the global one. This prevents children from fooling a parent interpreter into hiding the wrong command, by making the current namespace be different from the global one. For more details on hidden commands, see HIDDEN COMMANDS, below.

child hidden
  child 中の隠蔽された命令の全ての名前のリストを返す｡ Returns a list of the names of all hidden commands in child.

child invokehidden ?-option ...? hiddenName ?arg ..?
  この命令は child の解釈実行機能内で､引数 hiddenCmdName で与えられた隠蔽命令を起動する｡引数には置換も評価も適用されない｡三つの -options が運用されていて､全て - で始まります: -namespace (それは､後ろに一つの引数 nsName をとる)､と -global と -- である｡もし､この -namespace 旗標があると､あの隠蔽された命令が､ child 解釈実行機能内で起動される｡もし､ -global 旗標があると､あの隠蔽された命令は､ child 解釈実行機能内で､大域水準で起動される; それ以外の場合は､現在呼んだ枠で起動され､そこの中とそのそとの呼び出し枠内の局所変数を利用できる｡ -- 旗標は hiddenCmdName が文字 “-” で始まることを許容し､それ以外には必要ない｡もし､ -namespace と -global 旗標の両方が存在すると､ -namespace 旗標は無視される｡註意すべきは､あの隠蔽された命令は child 解釈実行機能の現在の文脈棚の枠内で実行される様になる(省略時設定として)｡隠蔽された命令の更なる詳細は下の HIDDEN COMMANDS を参照されたい｡ This command invokes the hidden command hiddenName with the supplied arguments, in child. No substitutions or evaluations are applied to the arguments. Three -options are supported, all of which start with -: -namespace (which takes a single argument afterwards, nsName), -global, and --. If the -namespace flag is given, the hidden command is invoked in the specified namespace in the child. If the -global flag is given, the command is invoked at the global level in the child; otherwise it is invoked at the current call frame and can access local variables in that or outer call frames. The -- flag allows the hiddenCmdName argument to start with a “-” character, and is otherwise unnecessary. If both the -namespace and -global flags are given, the -namespace flag is ignored. Note that the hidden command will be executed (by default) in the current context stack frame of child. For more details on hidden commands, see HIDDEN COMMANDS, below.

child issafe
  仔供の解釈実行機能が安全であれば1､そうでなければ0を返す｡ Returns 1 if the child interpreter is safe, 0 otherwise.

child limit limitType ?-option? ?value ...?
  子供 の解釈実行機能のための源資の限界 limitType の構成設定ついて､設定､操作､問合せをする｡ -option が全く指定されていないと､現在の限界の構成設定が返って来る｡もし､ -option だけの引数であると､その指示項目の値が返ります｡そうでない場合､ -option/value のリストの引数対を与えなければならない｡限界と指示項目を如何に与えるかについて更なる詳細は下の RESOURCE LIMITS を参照されたい｡ Sets up, manipulates and queries the configuration of the resource limit limitType for the child interpreter. If no -option is specified, return the current configuration of the limit. If -option is the sole argument, return the value of that option. Otherwise, a list of -option/value argument pairs must supplied. See RESOURCE LIMITS below for a more detailed explanation of what limits and options are supported.

child marktrusted
  子供の解釈実行機能に信頼良の印をつける｡この命令は信頼良の印の解釈実行機能からのみ起動できる｡この命令は子供の解釈実行機能内の隠蔽されている如何なる命令も顕示しない｡この命令は､子供の解釈実行機能に既に信頼良の印が付いていると効果はない｡ Marks the child interpreter as trusted. Can only be invoked by a trusted interpreter. This command does not expose any hidden commands in the child interpreter. The command has no effect if the child is already trusted.

child recursionlimit ?newlimit?
  child の解釈実行機能について､最大許容入れ子深さを返す｡もし､ newlimit が指定されていると､ child の解釈実行機能内の､ newlimit を超える Tcl_Eval() と､それに関連した child 内の手続函数への､呼出しの入れ子が不都合を返すように設定される｡その newlimit の値も返る｡newlimit の値は､正の整数であって､1 と､そのOSの非長精度整数の最大値との間の値でなければならない｡ Returns the maximum allowable nesting depth for the child interpreter. If newlimit is specified, the recursion limit in child will be set so that nesting of more than newlimit calls to Tcl_Eval() and related procedures in child will return an error. The newlimit value is also returned. The newlimit value must be a positive integer between 1 and the maximum value of a non-long integer on the platform.

  この命令は Tcl 呼出し棚の最大の寸法のみを設定する｡それ自身では､その応用譜に使用される C 言語の棚の溢れを防げない｡もし､使用している計算機がC言語の棚の寸法の限界を有していると､この命令で設定した限界に到達する前に棚の溢れに遭遇するかもしれない｡もし､そうなると､C言語の棚の寸法を増加する為の､今のシステムの仕組みが備わっているかを調べられたい｡ The command sets the maximum size of the Tcl call stack only. It cannot by itself prevent stack overflows on the C stack being used by the application. If your machine has a limit on the size of the C stack, you may get stack overflows before reaching the limit set by the command. If this happens, see if there is a mechanism in your system for increasing the maximum size of the C stack.

### SAFE INTERPRETERS

安全な解釈実行機能は､機能制限された機能で､それにより他の計算機環境に損害を与える恐れなしに､最悪の敵からの任意の記述譜を安全に実行する｡解釈実行機能を安全にする為に､ある種の命令と変数は解釈実行機能から取り除かれている｡譬えば､ディスク上にファイルを創造する命令と､ exec 命令は削除されている､理由は､副命令を通じて損害を引起す使用ができるので｡この様な便益への限定された利用も提供可能で､親の解釈実行機能への別名を作成して､それが､その引数を註意深く検査し､抑制された便益の限定品への制限付きの利用が提供される｡譬えば､ファイルの創造は特定の子供のディレクトリーの中で､註意深く選択され､固定されたプログラムの組合せに対して､副手順の起動が､許容され得る｡ A safe interpreter is one with restricted functionality, so that is safe to execute an arbitrary script from your worst enemy without fear of that script damaging the enclosing application or the rest of your computing environment. In order to make an interpreter safe, certain commands and variables are removed from the interpreter. For example, commands to create files on disk are removed, and the exec command is removed, since it could be used to cause damage through subprocesses. Limited access to these facilities can be provided, by creating aliases to the parent interpreter which check their arguments carefully and provide restricted access to a safe subset of facilities. For example, file creation might be allowed in a particular subdirectory and subprocess invocation might be allowed for a carefully selected and fixed set of programs.

安全な解釈実行機能は､この interp create 命令に指示項目 -safe を指定すると作成される｡更に､安全な解釈実行機能によって作成される如何なる仔供も安全なものになる｡ A safe interpreter is created by specifying the -safe switch to the interp create command. Furthermore, any child created by a safe interpreter will also be safe.

安全な解釈実行機能は､正確には次の組の組込み命令に生成される: A safe interpreter is created with exactly the following set of built-in commands:

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

次の命令は､安全な解釈実行機能を創造した時に interp create によって隠蔽される: The following commands are hidden by interp create when it creates a safe interpreter:

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

これらの命令は､Tcl 手続函数又は別名､として後程､再生成することができるか､又は､ interp expose によって再度顕示することができる｡ These commands can be recreated later as Tcl procedures or aliases, or re-exposed by interp expose.

運用されている手続函数の､Tcl の外部函数群からの次の命令は､安全な解釈実行機能の中には存在しない: The following commands from Tcl's library of support procedures are not present in a safe interpreter:

  auto_exec_ok | auto_import | auto_load
  auto_load_index | auto_qualify | unknown

特に註意すべきは､安全な解釈実行機能は省略時設定の unknown 命令を有せず､それで､ Tcl の省略時設定の自動組込み便益は利用できない｡自動組込みは､以下の､通常自動的に組込まれる Tcl の命令を利用する: Note in particular that safe interpreters have no default unknown command, so Tcl's default autoloading facilities are not available. Autoload access to Tcl's commands that are normally autoloaded:

  auto_mkindex | auto_mkindex_old
  auto_reset | history
  parray | pkg_mkIndex
  ::pkg::create | ::safe::interpAddToAccessPath
  ::safe::interpCreate | ::safe::interpConfigure
  ::safe::interpDelete | ::safe::interpFindInAccessPath
  ::safe::interpInit | ::safe::setLogCmd
  tcl_endOfWord | tcl_findLibrary
  tcl_startOfNextWord | tcl_startOfPreviousWord
  tcl_wordBreakAfter | tcl_wordBreakBefore

安全な解釈実行機能内で unknown 命令の明示的な定義によってのみ提供可能である｡このことは､ source 命令の顕示を含むことになる｡それは､Tcl の Safe-Tcl の仕組みを作成することにより､最も容易に達成される｡ Safe-Tcl は安全な版の source や load や命令の自動組込みや梱包の自動組込みに対応する為に必要なTcl命令を提供する｡ can only be provided by explicit definition of an unknown command in the safe interpreter. This will involve exposing the source command. This is most easily accomplished by creating the safe interpreter with Tcl's Safe-Tcl mechanism. Safe-Tcl provides safe versions of source, load, and other Tcl commands needed to support autoloading of commands and the loading of packages.

更に､あの env 変数は安全な解釈実行機能内には存在しない､それ故､環境変数を他の解釈実行機能と共有することはない｡ env 変数は､安全保障上の危険性を孕む､理由は､使用者は､環境変数内に敏感な情報を保存する可能性があるので｡譬えば､あの PGP 取扱説明書は PGP の個人的鍵擁護暗証番号を環境変数 PGPPASS 内に保存することを推奨している｡この変数を､安全な解釈実行機能内の信頼性のない算譜に実行させることは､安全保障上の危険性を招きうる｡ In addition, the env variable is not present in a safe interpreter, so it cannot share environment variables with other interpreters. The env variable poses a security risk, because users can store sensitive information in an environment variable. For example, the PGP manual recommends storing the PGP private key protection password in the environment variable PGPPASS. Making this variable available to untrusted code executing in a safe interpreter would incur a security risk.

もし､拡張された機能品が安全な解釈実行機能内に組込まれたら､それは､自身の非安全性の命令を除去する為の､自身の便益を制限するかもしれない｡安全性に関する､拡張された機能品の管理の議論については取扱説明書の Safe-Tcl と load Tcl 命令の項目を参照されたい｡ If extensions are loaded into a safe interpreter, they may also restrict their own functionality to eliminate unsafe commands. For a discussion of management of extensions for safety see the manual entries for Safe-Tcl and the load Tcl command.

安全な解釈実行機能は､それ自身を含む､何れの解釈実行機能の､再帰的限界をも取替えしない｡ A safe interpreter may not alter the recursion limit of any interpreter, including itself.

### ALIAS INVOCATION

この別名の仕組みは､ 縦え別名の目標が安全な解釈実行機能でなくても､安全な解釈実行機能内で実行される信頼できない記述譜の中で安全に使用できる様､注意深く設計されている｡安全性の保障をする上で､最も重要なことは､子供から親に渡された情報は親の中では決して評価も置換もされないことを厳守することである; もし､それが生じると､子供の中の邪悪な記述譜が親の中の任意の函数を起動し､安全保障を傷つけることになり得る｡ The alias mechanism has been carefully designed so that it can be used safely in an untrusted script which is being executed in a safe interpreter even if the target of the alias is not a safe interpreter. The most important thing in guaranteeing safety is to ensure that information passed from the child to the parent is never evaluated or substituted in the parent; if this were to occur, it would enable an evil script in the child to invoke arbitrary functions in the parent, which would compromise security.

別名の為の源譜が子供の解釈実行機能内で起動された時､その命令を調査した時に､通常のTcl 置換が遂行される｡この様な置換は､その解釈実行機能内で起動された他の何れの命令の処理とも同じ様に､源譜の解釈実行機能内で実行される｡源譜の命令の為の命令の手続函数は､新しい引数の配列を生成する為に､その引数を取り､ targetCmd と別名の為の arg と併合する｡もし､ srcCmd の語が “srcCmd arg1 arg2 ... argN” であったなら､新しい語の組は “targetCmd arg arg ... arg arg1 arg2 ... argN” になる､ここで､targetCmd と arg は､その別名が生成された時に､与えられた値である｡targetCmd は､目標の解釈実行機能内の命令手続函数を設置する為に使用され､命令手続函数は新しい引数の組と共に起動される｡もし､目標の解釈実行機能内に targetCmd の名前の命令がないと､不都合が生じる｡あの語には､更なる置換が遂行されることはない: あの目標の命令手続函数は､通常の Tcl 評価機構を通すことなく､直接起動される｡置換は､それぞれの語毎に正確に一回､遂行される: targetCmd と arg とはあの別名が生成した目例が調査される時に置換され､又､ arg1 ～ argN は､源の解釈実行機能内で､別名の源譜の命令が､調査される時に､置換される｡ When the source for an alias is invoked in the child interpreter, the usual Tcl substitutions are performed when parsing that command. These substitutions are carried out in the source interpreter just as they would be for any other command invoked in that interpreter. The command procedure for the source command takes its arguments and merges them with the targetCmd and args for the alias to create a new array of arguments. If the words of srcCmd were “srcCmd arg1 arg2 ... argN”, the new set of words will be “targetCmd arg arg ... arg arg1 arg2 ... argN”, where targetCmd and args are the values supplied when the alias was created. TargetCmd is then used to locate a command procedure in the target interpreter, and that command procedure is invoked with the new set of arguments. An error occurs if there is no command named targetCmd in the target interpreter. No additional substitutions are performed on the words: the target command procedure is invoked directly, without going through the normal Tcl evaluation mechanism. Substitutions are thus performed on each word exactly once: targetCmd and args were substituted when parsing the command that created the alias, and arg1 - argN are substituted when the alias's source command is parsed in the source interpreter.

安全な解釈実行機能の中の別名の為の目標命令 targetCmds を書く時､その命令の為の引数は決して評価されたり置換されたりしないことである､理由はそれが抜け道を提供し､その解釈実行機能の子供の解釈実行機能が親の中の任意の符号命令を実行できるから｡これは順次体系の安全保障系を蝕む｡ When writing the targetCmds for aliases in safe interpreters, it is very important that the arguments to that command never be evaluated or substituted, since this would provide an escape mechanism whereby the child interpreter could execute arbitrary code in the parent. This in turn would compromise the security of the system.

### HIDDEN COMMANDS

安全な解釈実行機能は､ Tcl 算譜がその中での実行に利用する便益を大幅に制限する｡信頼できない Tcl 算譜に直接この便益の利用を許容することは安全ではない､理由は､環境上の様々な攻撃に利用可能であるから｡しかし､安全な解釈実行機能の文脈の中で危険な便益を使用する合理的な必要性もある｡譬えば､時には､算譜は解釈実行機能に source として持込む必要がある｡他の例は､Tk であり､ここでは､窓は特有の解釈実行機能の為の窓の階層構造に束縛されている; ある潜在的に危険な函数､譬えば､窓の管理は､解釈実行機能の文脈の内部の､この様な窓の上で遂行されなければならない｡ Safe interpreters greatly restrict the functionality available to Tcl programs executing within them. Allowing the untrusted Tcl program to have direct access to this functionality is unsafe, because it can be used for a variety of attacks on the environment. However, there are times when there is a legitimate need to use the dangerous functionality in the context of the safe interpreter. For example, sometimes a program must be sourced into the interpreter. Another example is Tk, where windows are bound to the hierarchy of windows for a specific interpreter; some potentially dangerous functions, e.g. window management, must be performed on these windows within the interpreter context.

この interp 命令はこの問題の決定に隠蔽された命令の形式で解決策を提供する｡安全な解釈実行機能から危険な命令を完全に除去する代わりに､これらの命令を隠蔽し､解釈実行機能内で実行する Tcl 記述譜に命令が利用できなくする｡しかし､その様な隠蔽された命令は､安全な解釈実行機能のどの信頼できる仔供によっても､安全な解釈実行機能の文脈の中で interp invoke を使用して起動することが可能である｡隠蔽された命令と顕示された命令は､別々の名前空間に別けてある｡隠蔽された命令と顕示された命令を一つの解釈実行機能の内部で同じ名前によって定義することは可能である｡ The interp command provides a solution to this problem in the form of hidden commands. Instead of removing the dangerous commands entirely from a safe interpreter, these commands are hidden so they become unavailable to Tcl scripts executing in the interpreter. However, such hidden commands can be invoked by any trusted ancestor of the safe interpreter, in the context of the safe interpreter, using interp invoke. Hidden commands and exposed commands reside in separate name spaces. It is possible to define a hidden command and an exposed command by the same name within one interpreter.

子供の解釈実行機能内の隠蔽された命令は､別名の起動中に親の中で呼ばれた手続函数の本体内で起動することが可能である｡譬えば､ source 命令の為の別名は子供の解釈実行機能内で生成することができる｡子供の解釈実行機能内で起動された時､操作が許容されているかを確認する為に､手続函数が親の解釈実行機能内で呼出さる(譬えば､子供の解釈実行機能が利用を許容されているファイルを､源譜に尋ねる)｡次に､手続函数は､ファイルの内容を実際に源とする為に､子供の解釈実行機能内の隠蔽された source 命令を起動する｡註意すべきは､名前が source の二つの命令が子供の解釈実行機能内にある: 別名と､隠蔽された命令である｡ Hidden commands in a child interpreter can be invoked in the body of procedures called in the parent during alias invocation. For example, an alias for source could be created in a child interpreter. When it is invoked in the child interpreter, a procedure is called in the parent interpreter to check that the operation is allowable (e.g. it asks to source a file that the child interpreter is allowed to access). The procedure then it invokes the hidden source command in the child interpreter to actually source in the contents of the file. Note that two commands named source exist in the child interpreter: the alias, and the hidden command.

親の解釈実行機能は､隠蔽された命令を､別名の起動の処理子の部分として起動するかも知れないので､別名の起動を通して渡された､いずれかの引数が評価されることを避ける為に非常なる註意が必要である｡さもなくば､悪性の子供の解釈実行機能が自己の為に信頼されている親の解釈実行機能に､危険な命令の実行を強制させうる｡この事柄の更なる完全な論議については､ ALIAS INVOCATION の項を参照されたい｡この問題を回避する手助けは､ interp invokehidden の引数には置換も評価も適用しないことである｡ Because a parent interpreter may invoke a hidden command as part of handling an alias invocation, great care must be taken to avoid evaluating any arguments passed in through the alias invocation. Otherwise, malicious child interpreters could cause a trusted parent interpreter to execute dangerous commands on their behalf. See the section on ALIAS INVOCATION for a more complete discussion of this topic. To help avoid this problem, no substitutions or evaluations are applied to arguments of interp invokehidden.

安全な解釈実行機能は､自己自身の或は､その仔供の中での､隠蔽された命令の起動は許可されていない｡之は､安全な子供が､自己自身の或は､その仔供の中で､隠蔽された便益を利用することを妨げている｡ Safe interpreters are not allowed to invoke hidden commands in themselves or in their descendants. This prevents them from gaining access to hidden functionality in themselves or their descendants.

解釈実行機能内の隠蔽された命令の組合せは､interp expose と interp hide を使うことにより信頼できる解釈実行機能によって操作可能である｡ interpexpose 命令は隠蔽された命令を､ path で識別される解釈実行機能内の顕示された命令に移動し､潜在的に手順の中の命令を名前変更する｡もし､目標となる名前として顕示された命令が既に存在すると､操作は失敗する｡同様に､ interp hide は､その解釈実行機能内の顕示された命令を隠蔽命令に設定する｡安全な解釈実行機能は､自己自身の或は､その仔供の中での､隠蔽と顕示の命令の組合せの間で命令を移動することは許可されていない｡ The set of hidden commands in an interpreter can be manipulated by a trusted interpreter using interp expose and interp hide. The interp expose command moves a hidden command to the set of exposed commands in the interpreter identified by path, potentially renaming the command in the process. If an exposed command by the targeted name already exists, the operation fails. Similarly, interp hide moves an exposed command to the set of hidden commands in that interpreter. Safe interpreters are not allowed to move commands between the set of hidden and exposed commands, in either themselves or their descendants.

現在の所､隠蔽された名前の命令は名前空間修飾子を含まない､又､隠蔽する前に､初めに名前空間内の命令を大域名前空間に名前変更しなくてはならない｡ interp hide によって隠蔽される命令は､たとえ現在の名前空間が大域のものではなくても､大域名前空間内から捜される｡これは､現在の名前空間を大域のものと異なるものにさせることにより､仔供解釈実行機能が親解釈実行機能を騙して悪い命令を隠蔽する､ことを防いでいる｡ Currently, the names of hidden commands cannot contain namespace qualifiers, and you must first rename a command in a namespace to the global namespace before you can hide it. Commands to be hidden by interp hide are looked up in the global namespace even if the current namespace is not the global one. This prevents children from fooling a parent interpreter into hiding the wrong command, by making the current namespace be different from the global one.

### RESOURCE LIMITS

全ての解釈実行機能は２種類の源資限界を有する､それは､如何なる親解釈実行機能によっても､その子供の解釈実行機能に強要されるされ得る｡命令の限界(命令の型の)は､解釈実行機能により実行され得る( info cmdcount 命令を経由調査されることが可能な如く ) Tclの命令の総数を制限し､そして､それ迄に､その解釈実行機能の内部での実行が完遂されなければならない､時間の限界(time の型)を置く｡註意すべきは､時間の限界は絶対時間(clock seconds 命令の如き)で表現され､相対時間( after 命令の如き)ではない､理由は相対は生成後に修正ができるから｡ Every interpreter has two kinds of resource limits that may be imposed by any parent interpreter upon its children. Command limits (of type command) restrict the total number of Tcl commands that may be executed by an interpreter (as can be inspected via the info cmdcount command), and time limits (of type time) place a limit by which execution within the interpreter must complete. Note that time limits are expressed as absolute times (as in clock seconds) and not relative times (as in after) because they may be modified after creation.

限界が解釈実行機能の設定を超えた時､初めに､親の解釈実行機能に設定された､何かの回収処理機能子が呼出される｡もしこの様な回収が増加又は､限界が除去されると､(予め設定した)限界の範囲内で解釈実行機能は､実行を継続する｡もし､その限界が依然として抑制していると､その位置で不都合が発生し､その解釈実行機能の内部での不具合の通常の進捗は不可能になり､その故に不具合が外部に向けて増殖し(その進行に連れ棚-追跡を構築し)､それが捕捉し処理する処理譜を呼ぶ担当のある所の､制限された解釈実行機能が起動する位置に至る(譬えば､ interp eval によって)｡ When a limit is exceeded for an interpreter, first any handler callbacks defined by parent interpreters are called. If those callbacks increase or remove the limit, execution within the (previously) limited interpreter continues. If the limit is still in force, an error is generated at that point and normal processing of errors within the interpreter (by the catch command) is disabled, so the error propagates outwards (building a stack-trace as it goes) to the point where the limited interpreter was invoked (e.g. by interp eval) where it becomes the responsibility of the calling code to catch and handle.

#### 指示項目の制限 LIMIT OPTIONS

全ての限界は､それに関連する､多くの指示項目を有し､その幾つかは､全ての種類の制限に横断的に共通で､他のものは､その種類の制限に固有である｡ Every limit has a number of options associated with it, some of which are common across all kinds of limits, and others of which are particular to the kind of limit.

-command
  この指示項目は(全ての制限の型に共通)､その解釈実行機能の大域名前空間内で実行されるTcl 記述譜(それが空でなければ)に､限定された解釈実行機能内で､特定の限界が､超えた時に､指示項目を読み書きする様に規定する｡回収は､限定された解釈実行機能の実行の継続を望む場合､解釈実行機能上の限界を修正し得る｡もし､回収が例外を発生したら､背景処理の例外処理機構を通して報告される(BACKGROUND EXCEPTION HANDLING 参照)｡註意すべきは､一つの解釈実行機能に定義された回収は､完全に他から定義された回収とは互いに完全に隔離され､これらの回収が呼出される順序は定期されない｡ This option (common for all limit types) specifies (if non-empty) a Tcl script to be executed in the global namespace of the interpreter reading and writing the option when the particular limit in the limited interpreter is exceeded. The callback may modify the limit on the interpreter if it wishes the limited interpreter to continue executing. If the callback generates an exception, it is reported through the background exception mechanism (see BACKGROUND EXCEPTION HANDLING). Note that the callbacks defined by one interpreter are completely isolated from the callbacks defined by another, and that the order in which those callbacks are called is undefined.

-granularity
  この指示項目は(全ての限界の型に共通)､如何に頻繁に(限界の試験が可能な位置で､Tcl 解釈実行機能が首尾一貫した状態の時､以外で)､制限が実際試験されるかを規定する｡これは､如何に頻繁に限界が試験されるかの調整を許容する､つまり､如何に頻繁に､限界試験の雑務が増加するか(時間の限界の場合は重要になり得る)をも｡ This option (common for all limit types) specifies how frequently (out of the points when the Tcl interpreter is in a consistent state where limit checking is possible) that the limit is actually checked. This allows the tuning of how frequently a limit is checked, and hence how often the limit-checking overhead (which may be substantial in the case of time limits) is incurred.

-milliseconds
  この指示項目は､時刻の限界が発動さる -seconds 指示項目の中で定義された瞬間の後に､様々なことを多く指定する｡それは､常に､ -seconds 指示項目と一緒にのみ､指定される(予め指定される､又はこの起動で指定されるを問はず)｡ This option specifies the number of milliseconds after the moment defined in the -seconds option that the time limit will fire. It should only ever be specified in conjunction with the -seconds option (whether it was set previously or is being set this invocation.)

-seconds
  この指示項目は､その限界の時刻に､解釈実行機能が発動する様に､特定の時( clock seconds 参照)からの秒の数を指定する｡その発動される限界は秒の水準であり､ -milliseconds 指示項目を使わない限り秒以下の単位にはならない｡この指示項目は､空文字列かも知れず､それは､この解釈実行機能には刻限は設定しないことを表す｡ This option specifies the number of seconds after the epoch (see clock seconds) that the time limit for the interpreter will be triggered. The limit will be triggered at the start of the second unless specified at a sub-second level using the -milliseconds option. This option may be the empty string, which indicates that a time limit is not set for the interpreter.

-value
  この指示項目は､命令の限界の発動までに､解釈実行機能が実行するであろう命令の数をしていする｡この指示項目は､空文字列かも知れず､それは､この解釈実行機能には命令の数の限界は設定しないことを表す｡ This option specifies the number of commands that the interpreter may execute before triggering the command limit. This option may be the empty string, which indicates that a command limit is not set for the interpreter.

源資の限界を伴う解釈実行機能は､それを子供の解釈実行機能を生成に設定する｡そして､その子供の解釈実行機能は源資の限界を強制され､少なくとも親の解釈実行機能の生成の限界と同じ程度に制限を受ける｡もし､制限された解釈実行機能の親の解釈実行機能がこの状態を緩和したいならば､子供の中の interp 命令を隠蔽するのが好く､別名と､interp invokehidden 副命令を､必要に応じ､制限された親に､ interp 命令を選択する様に利用できる様にする為に使用する｡ Where an interpreter with a resource limit set on it creates a child interpreter, that child interpreter will have resource limits imposed on it that are at least as restrictive as the limits on the creating parent interpreter. If the parent interpreter of the limited parent wishes to relax these conditions, it should hide the interp command in the child and then use aliases and the interp invokehidden subcommand to provide such access as it chooses to the interp command to the limited parent as necessary.

### BACKGROUND EXCEPTION HANDLING

直接に棚に報告できない状況で､例外が発生した時は(譬えば､update や vwait 呼出しの中の行事の処理)､その例外は代りに､背景処理の例外処理の仕組みを経由して報告される｡全ての解釈実行機能は登録された背景処理の例外処理機能子を有する; 省略時設定の例外処理機能子は､解釈実行機能内の呼出される大域名前空間の bgerror 命令の為に､手配されるが､他の例外処理機能子が搭載され､背景処理の例外は本質的に異なる方法で処理されるかもしれない｡ When an exception happens in a situation where it cannot be reported directly up the stack (e.g. when processing events in an update or vwait call) the exception is instead reported through the background exception handling mechanism. Every interpreter has a background exception handler registered; the default exception handler arranges for the bgerror command in the interpreter's global namespace to be called, but other exception handlers may be installed and process background exceptions in substantially different ways.

背景処理の例外の処理機能子は非空の語のリストからなり､それには起動時に二つの更なる語が追加される｡第１語は例外の瞬間の解釈実行機能の結果で典型的には､不都合伝達文で､第２は､例外が生じた瞬間の辞書の返り指示項目である｡それらは､非背景処理の状況で記述譜の評価を制御している時に catch が捕捉できる値と同じである｡結果のリストは､解釈実行機能内の大域名前空間内で､更なる置換の遂行なしに､実行することができる｡ A background exception handler consists of a non-empty list of words to which will be appended two further words at invocation time. The first word will be the interpreter result at time of the exception, typically an error message, and the second will be the dictionary of return options at the time of the exception. These are the same values that catch can capture when it controls script evaluation in a non-background situation. The resulting list will then be executed in the interpreter's global namespace without further substitutions being performed.

### 著作権表示 CREDITS

この安全解釈実行機能の仕組みは､Nathaniel Borenstein 氏と Marshall Rose 氏が実現した Safe-Tcl 模型に基づく｡ The safe interpreter mechanism is based on the Safe-Tcl prototype implemented by Nathaniel Borenstein and Marshall Rose.

### 用例 EXAMPLES

現在の解釈実行機能内で命令の別名を生成して使用する: Creating and using an alias for a command in the current interpreter:

    interp alias {} getIndex {} lsearch {alpha beta gamma delta}
    set idx [getIndex delta]

全ての lappend 命令の起動が日誌記帳される様になっている安全な解釈実行機能内で､任意の命令を実行する: Executing an arbitrary command in a safe interpreter where every invocation of lappend is logged:

    set i [interp create -safe]
    interp hide $i lappend
    interp alias $i lappend {} loggedLappend $i
    proc loggedLappend {i args} {
        puts "logged invocation of lappend $args"
        interp invokehidden $i lappend {*}$args
    }
    interp eval $i $someUntrustedScript

無限繰返しが終息する様に､解釈実行機能に源資の限界を設定する｡ Setting a resource limit on an interpreter so that an infinite loop terminates.

    set i [interp create]
    interp limit $i command -value 1000
    interp eval $i {
        set x 0
        while {1} {
            puts "Counting up... [incr x]"
        }
    }

### SEE ALSO

bgerror, load, safe, Tcl_CreateChild, Tcl_Eval, Tcl_BackgroundException

### KEYWORDS

alias, parent interpreter, safe interpreter, child interpreter
Copyright © 1995-1996 Sun Microsystems, Inc.
Copyright © 2004 Donal K. Fellows
Copyright © 2006-2008 Joe Mistachkin.