743 lines
34 KiB
HTML
743 lines
34 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
<html>
|
||
<head>
|
||
<title>interp</title>
|
||
</head>
|
||
|
||
<body>
|
||
<h1>interp</h1>
|
||
|
||
<p> Команда создает и управляет Tcl-интерпретаторами. </p>
|
||
|
||
<h2>СИНТАКСИС</h2>
|
||
|
||
<pre>
|
||
<strong>interp</strong> <em>option</em> ?<em>arg</em> <em>arg</em>...?
|
||
</pre>
|
||
|
||
<h2>ОПИСАНИЕ</h2>
|
||
|
||
<p>Эта команда позволяет создавать один или несколько новых
|
||
Tcl-интерпретаторов, которые сосуществуют в одном приложении с
|
||
создавшим их интерпретатором. Создавший интерпретатор называется
|
||
мастер-интерпретатором, а созданные интерпретаторы называются
|
||
подчиненными (<em>slave</em>) интерпретаторами.
|
||
Мастер-интерпретатор может создавать произвольное число
|
||
подчиненных интерпретаторов, а каждый из подчиненных может в
|
||
свою очередь создавать подчиненные интерпретаторы, для которых
|
||
он сам является мастер-интерпретатором. В результате в
|
||
приложении может создаваться иерархия интерпретаторов.
|
||
</p>
|
||
|
||
<p>Каждый интерпретатор независим от остальных. Он имеет
|
||
собственное пространство имен для команд, процедур и глобальных
|
||
переменных. Мастер-интерпретатор может создавать связи между
|
||
подчиненными интерпретаторами и собой, используя механизм
|
||
алиасов. Алиас - это команда в подчиненном интерпретаторе,
|
||
которая, при ее вызове, вызывает другую команду в
|
||
мастер-интерпретаторе или в другом подчиненном
|
||
интерпретаторе. Кроме механизма алиасов, связь между
|
||
интерпретаторами поддерживается только через переменные
|
||
окружения. Массив <a
|
||
href="tclvars.html#env"><strong>env</strong></a>>обычно является общим для
|
||
всех интерпретаторов в приложении. Необходимо заметить, что
|
||
идентификаторы каналов (например, идентификатор, возвращаемый
|
||
командой <a href= "open.html"><strong>open</strong></a>) больше не
|
||
разделяются между интерпретаторами, как это было в предыдущих
|
||
версиях Tcl. Чтобы обеспечить совместный доступ к каналам,
|
||
необходимо использовать явные команды для передачи
|
||
идентификаторов каналов из интерпретатора в интерпретатор.
|
||
</p>
|
||
|
||
<p>Команда <strong>interp</strong> позволяет также создавать надежные
|
||
интерпретаторы. Надежный интерпретатор - это интерпретатор с
|
||
существенно урезанной функциональностью, поэтому он может
|
||
исполнять ненадежные скрипты без риска нарушить работу
|
||
вызывающего их приложения. Например, из безопасных
|
||
интерпретаторов недоступны команды создания каналов и
|
||
подпроцессов. Более подробно см. <a href=
|
||
"#БЕЗОПАСНЫЕ">Безопасные интерпретаторы</a>. Опасная
|
||
функциональность не удалена из безопасных интерпретаторов, но
|
||
скрыта таким образом, что только надежные интерпретаторы могут
|
||
получить к ней доступ. Более подробно см. <a href=
|
||
"#СКРЫТЫЕ КОМАНДЫ">Скрытые команды</a>. Механизм
|
||
алиасов может быть использован для безопасного взаимодействия
|
||
между подчиненным интерпретатором и его
|
||
мастер-интерпретатором. Более подробно этот вопрос обсуждается в
|
||
разделе "<a
|
||
href="#ИСПОЛЬЗОВАНИЕ АЛИАСОВ">Использование алиасов</a>".
|
||
</p>
|
||
|
||
<p>Полное имя интерпретатора представляет собой список, содержащий
|
||
имена его предков в иерархии интерпретаторов и заканчивающийся
|
||
именем интерпретатора в его непосредственном предке. Имена
|
||
интерпретаторов в списке - это их относительные имена в их
|
||
непосредственных мастер-интерпретаторах. Например, если <strong>a</strong>
|
||
есть подчиненный интерпретатор текущего интерпретатора и, в свою
|
||
очередь, имеет подчиненный интерпретатор <strong>a1</strong>, а тот, в
|
||
свою очередь, имеет подчиненный интерпретатор <strong>a11</strong>, то
|
||
полное имя <strong>a11</strong> в <strong>a</strong> есть список <strong>{a1 a11}</strong>.
|
||
</p>
|
||
|
||
<p>В качестве аргумента описанной ниже команды <strong>interp</strong>
|
||
используется полное имя интерпретатора. Интерпретатор, в котором
|
||
исполняется команда, всегда обозначается как <strong>{}</strong> (пустая
|
||
строка). Обратите внимание, что в подчиненном интерпретаторе
|
||
невозможно сослаться на мастер-интерпретатор кроме как через
|
||
алиасы. Также нет никакого имени, под которому можно было бы
|
||
сослаться на мастер-интерпретатор, первым созданный в
|
||
приложении. Оба ограничения вызваны соображениями безопасности.
|
||
</p>
|
||
|
||
<h2>КОМАНДА INTERP</h2>
|
||
|
||
<p> Команда <strong>interp</strong> используется для создания, удаления и
|
||
выполнения команд в подчиненном интерпретаторе, а также для
|
||
разделения или передачи каналов между интерпретаторами. Она
|
||
может иметь одну из перечисленных ниже форм в зависимости от
|
||
значения аргумента <em>option</em>.
|
||
</p>
|
||
|
||
<dl>
|
||
<dt> <a name="alias"></a><strong>interp</strong> <strong>alias</strong>
|
||
<em>srcPath</em> <em>srcCmd</em></dt>
|
||
|
||
<dd>Возвращает список, состоящий из исходной команды и
|
||
аргументов, связанных с алиасом <em>srcCmd</em> в интерпретаторе
|
||
<em>srcPath</em> (возвращаются значения, использовавшиеся при
|
||
создании алиаса, так как имя команды могло быть изменено с
|
||
помощью команды <a href= "rename.html"><strong>rename</strong></a>).
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>alias</strong> <em>srcPath</em> <em>srcCmd</em>
|
||
<em>{}</em></dt>
|
||
|
||
<dd>Удаляет алиас <em>srcCmd</em> в подчиненном интерпретаторе
|
||
<em>srcPath</em>. Имя <em>srcCmd</em> - это имя, под которым алиас
|
||
был создан. Если созданная команда была переименована, то
|
||
будет удалена переименованная команда.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>alias</strong> <em>srcPath</em> <em>srcCmd</em>
|
||
<em>targetPath</em> <em>targetCmd</em> ?<em>arg</em> <em>arg</em>...?</dt>
|
||
|
||
<dd><p>Эта команда создает алиас между двумя подчиненными
|
||
интерпретаторами (для создания алиаса между подчиненным
|
||
интерпретатором и мастер-интерпретатором используется
|
||
команда <strong>slave alias</strong>). Оба интерпретатора <em>
|
||
srcPath</em> и <em>targetPath</em> должны быть в иерархии
|
||
интерпретаторов ниже того интерпретатора, в котором
|
||
выполняется команда. Аргументы s<em>rcPath</em> и <em>
|
||
srcCmd</em> задают интерпретатор, в котором будет создан
|
||
алиас и его имя. Аргумент s<em>rcPath</em> должен быть
|
||
Tcl-списком, задающим имя существующего интерпретатора.
|
||
Например, "<strong>a b</strong>" определяет интерпретатор
|
||
<strong>b</strong>, который является подчиненным интерпретатором
|
||
интерпретатора <strong>a</strong>, который в свою очередь является
|
||
подчиненным интерпретатором текущего интерпретатора. Пустой
|
||
список соответствует текущему интерпретатору (в котором
|
||
исполняется команда). Аргумент <em>srcCmd</em> определяет имя
|
||
новой команды-алиаса, которая будет создана в интерпретаторе
|
||
s<em>rcPath</em>. Аргументы <em>targetPath</em> и
|
||
<em>targetCmd</em> определяют целевой интерпретатор и команду,
|
||
а аргументы <em>arg</em>, если они есть, определяют
|
||
дополнительные аргументы для команды <em>targetCmd</em>,
|
||
которые будут вставлены перед аргументами, заданным при
|
||
вызове srcCmd. Команда <em>targetCmd</em> может как
|
||
существовать, так и не существовать в момент создания
|
||
алиаса. В последнем случае она не создается командой
|
||
<strong>interp alias.</strong></p>
|
||
|
||
<p> Алиас позволяет использовать команду <em>targetCmd</em> в
|
||
интерпретаторе <em>targetPath</em> каждый раз, когда
|
||
вызывается команда-алиас<em>srcCmd</em> в интерпретаторе <em>
|
||
srcPath</em>. Подробнее см. "Использование алиасов".
|
||
</p>
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>aliases</strong> ?<em>path</em>?</dt>
|
||
|
||
<dd> Эта команда возвращает список имен всех команд-алиасов,
|
||
определенных в интерпретаторе <em>path</em>.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>create</strong> ?<em>-safe</em>? ?<em>--</em>?
|
||
?<em>path</em>?</dt>
|
||
|
||
<dd><p>Создает подчиненный интерпретатор с именем <em>path</em> и
|
||
новую команду для работы с этим интерпретатором, называемую
|
||
также подчиненной (slave) командой. Имя подчиненной команды
|
||
совпадает с последним элементом списка <em>path</em>. Новый
|
||
подчиненный интерпретатор и подчиненная команда создаются в
|
||
интерпретаторе, имя которого состоит из всех элементов
|
||
списка <em>path</em>, кроме последнего. Например, если
|
||
аргумент <em>path</em> равен <strong>a b c</strong>, то в результате в
|
||
интерпретаторе <strong>a b</strong> будет создан подчиненный
|
||
интерпретатор <strong>c</strong> и подчиненная команда <strong>c</strong>.
|
||
Синтаксис подчиненной команды описан ниже см. "Команда
|
||
работы с интерпретатором". Если аргумент <em>path</em>
|
||
отсутствует, Tcl создает уникальное имя в форме <strong>
|
||
interp</strong>x, где <em>x</em> - целое число, и использует его
|
||
для подчиненного интерпретатора и подчиненной команды. Если
|
||
в команде указана опция <strong>-safe</strong> или если
|
||
мастер-интерпретатор сам является безопасным
|
||
интерпретатором, новый подчиненный интерпретатор будет
|
||
безопасным, то есть с ограниченной функциональностью. В
|
||
противном случае новый интерпретатор будет включать полный
|
||
набор встроенных Tcl-команд и переменных. Аргумент -
|
||
используется для того, чтобы обозначить конец опций.
|
||
Следующий аргумент будет использоваться как имя
|
||
интерпретатора, даже если он равен <strong>-safe</strong>.</p>
|
||
|
||
<p>Команда <strong>interp create</strong> возвращает имя нового
|
||
интерпретатора. Имя подчиненного интерпретатора должно быть
|
||
уникальным среди подчиненных интерпретаторов его мастера.
|
||
Если у мастер-идентификатора уже существует.</p>
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>delete</strong> ?<em>path</em>...?</dt>
|
||
|
||
<dd> Удаляет ноль или больше интерпретаторов с именем
|
||
<em>path</em>. Для каждого удаляемого интерпретатора удаляются
|
||
также его подчиненные интерпретаторы. Если для одного из
|
||
аргументов <em>path</em> интерпретатора с таким именем не
|
||
существует, команда генерирует ошибку.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>eval</strong> <em>path</em> <em>arg</em>
|
||
?<em>arg</em>...? </dt>
|
||
|
||
<dd> Команда объединяет все аргументы так же, как команда <a
|
||
href="concat.html"><strong>concat</strong></a>, а затем исполняет
|
||
сформированный скрипт в подчиненном интерпретаторе, заданном
|
||
аргументом <em>path</em>. Результат выполнения (включая
|
||
информацию об ошибках в переменных <a href=
|
||
"tclvars.html#errorInfo"><strong>errorInfo</strong></a> и <a href=
|
||
"tclvars.html#errorCode"><strong>errorCode</strong></a>, если произошла
|
||
ошибка) возвращается в вызывающий интерпретатор.
|
||
</dd>
|
||
|
||
<dt><a name="exists"></a><strong>interp</strong> <strong>exists</strong>
|
||
<em>path</em></dt>
|
||
|
||
<dd> Возвращает <strong>1</strong>, если подчиненный интерпретатор с
|
||
именем <em>path</em> существует в его мастер-интерпретаторе. В
|
||
противном случае возвращает <strong>0</strong>. Если аргумент
|
||
<em>path</em> представляет относительное имя, то он ищется в том
|
||
интерпретаторе, в котором выполняется команда.
|
||
</dd>
|
||
|
||
<dt><a name="expose"></a><strong>interp</strong> <strong>expose</strong>
|
||
<em>path</em> <em>hiddenName</em> ?<em>exposedCmdName</em>?</dt>
|
||
|
||
<dd> Разрешает использование в интерпретаторе <em>path</em>
|
||
скрытой команды <em>hiddenName</em> под новым именем
|
||
<em>exposedCmdName</em> (в настоящее время поддерживаются только
|
||
имена в глобальном пространстве имен, не содержащие
|
||
"<strong>::</strong>"). Если обычная (не скрытая) команда
|
||
<em>exposedCmdName</em> уже существует, генерируется сообщение
|
||
об ошибке. Скрытые команды обсуждаются подробно см. "<a
|
||
href="#СКРЫТЫЕ КОМАНДЫ">Скрытые команды</a>".
|
||
</dd>
|
||
|
||
<dt><a name="hide"></a><strong>interp</strong> <strong>hide</strong> <em>path</em>
|
||
<em>exposedCmdName</em> ?<em>hiddenCmdName</em>?</dt>
|
||
|
||
<dd> Запрещает использование в интерпретаторе <em>path</em>
|
||
обычной команды <em>exposedCmdName</em> и переименовывает ее в
|
||
скрытую команду <em>hiddenCmdName</em> (или в скрытую команду
|
||
под старым именем, если новое не было задано). Если скрытая
|
||
команда с заданным именем уже существует, команда возвращает
|
||
ошибку. В настоящее время <em>exposedCmdName</em> и
|
||
<em>hiddenCmdName</em> не могут содержать "<strong>::</strong>".
|
||
Команды, которые должны быть скрыты с помощью <strong>interp
|
||
hide</strong>, ищутся только в глобальном пространстве имен, даже
|
||
если текущее пространство имен не глобальное. Скрытые команды
|
||
обсуждаются подробно ниже (см. "<a href=
|
||
"#СКРЫТЫЕ КОМАНДЫ">Скрытые команды</a>").
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>hidden</strong> <em>path</em></dt>
|
||
|
||
<dd>Возвращает список скрытых команд интерпретатора
|
||
<em>path</em>.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>invokehidden</strong> <em>path</em>
|
||
?<em>-global</em>? <em>hiddenCmdName</em> ?<em>arg</em>...?</dt>
|
||
|
||
<dd> Вызывает в интерпретаторе <em>path</em> скрытую команду
|
||
<em>hiddenCmdName</em> с перечисленными аргументами. Никаких
|
||
подстановок или вычислений в аргументах не производится. Если
|
||
указана опция <em>-global</em>, скрытая команда выполняется на
|
||
глобальном уровне в целевом интерпретаторе. В противном
|
||
случае она выполняется в текущем контексте и может
|
||
использовать значения локальных переменных и переменных из
|
||
вышестоящих стеков. Скрытые команды обсуждаются подробно в
|
||
соответствующем разделе ниже.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>issafe</strong> ?<em>path</em>? </dt>
|
||
|
||
<dd>Возвращает <strong>1</strong>, если интерпретатор <em>path</em>
|
||
безопасный, и <strong>0</strong> в противном случае.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>marktrusted</strong> <em>path</em></dt>
|
||
|
||
<dd>Отмечает интерпретатор <em>path</em> как надежный. Не
|
||
раскрывает скрытые команды. Команда <strong>interp marktrusted</strong>
|
||
может выполняться только из надежного интерпретатора. Если
|
||
интерпретатор <em>path</em> уже надежный, команда не оказывает
|
||
никакого воздействия.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>share</strong> <em>srcPath</em> <em>channelId</em>
|
||
<em>destPath</em></dt>
|
||
|
||
<dd>Позволяет разделить канал ввода - вывода <em>channelId</em>
|
||
между интерпретаторами <em>srcPath</em> и <em>destPath</em>. Оба
|
||
интерпретатора после этого будут иметь одинаковые права на
|
||
канал. Каналы ввода - вывода, доступные в интерпретаторе,
|
||
автоматически закрываются, когда удаляется интерпретатор.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>slaves</strong> ?<em>path</em>?</dt>
|
||
|
||
<dd>Возвращает список подчиненных интерпретаторов для
|
||
интерпретатора <em>path</em>. Если аргумент <em>path</em>
|
||
отсутствует, возвращает список подчиненных интерпретаторов для
|
||
интерпретатора, в котором выполняется команда.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>target</strong> <em>path</em> <em>alias</em></dt>
|
||
|
||
<dd> Возвращает список, описывающий целевой интерпретатор
|
||
(интерпретатор, в котором выполняется реальная команда при
|
||
вызове команды-алиаса) для алиаса <em>alias</em>. Алиас задается
|
||
именем интерпретатора <em>path</em> и команды-алиаса
|
||
<em>alias</em> как в команде <strong>interp alias</strong> выше. Имя
|
||
целевого интерпретатора возвращается как имя интерпретатора
|
||
относительно имени интерпретатора, в котором выполняется
|
||
команда. Если это текущий интерпретатор, то возвращается
|
||
пустой список. Если этот интерпретатор не является потомком
|
||
интерпретатора, в котором выполняется команда, генерируется
|
||
ошибка. Реальная команда не обязана быть определена в момент
|
||
выполнения данной команды.
|
||
</dd>
|
||
|
||
<dt><strong>interp</strong> <strong>transfer</strong> <em>srcPath</em>
|
||
<em>channelId</em> <em>destPath</em> </dt>
|
||
|
||
<dd>Делает канал ввода - вывода <em>channelId</em> доступным в
|
||
интерпретаторе <em>destPath</em> и недоступным в интерпретаторе
|
||
<em>srcPath</em>.
|
||
</dd>
|
||
</dl>
|
||
|
||
<h2><a name="КОМАНДА РАБОТЫ С ИНТЕРПРЕТАТОРОМ"></a>КОМАНДА РАБОТЫ С
|
||
ИНТЕРПРЕТАТОРОМ (ПОДЧИНЕННАЯ КОМАНДА)</h2>
|
||
|
||
<p>Для каждого подчиненного интерпретатора, созданного с помощью
|
||
команды <strong>interp</strong>, в мастер-интерпретаторе создается команда
|
||
с тем же именем, что и подчиненный интерпретатор. Эта команда
|
||
предназначена для выполнения различных операций в подчиненном
|
||
интерпретаторе. В общем случае она имеет следующий вид:
|
||
</p>
|
||
|
||
<pre>
|
||
slave command ?arg arg...?
|
||
</pre>
|
||
<p>где <em>slave</em> - имя подчиненного интерпретатора, а
|
||
аргументы <em>command</em> и <em>arg</em> <em>arg</em>... определяют
|
||
конкретное назначение команды. Ниже перечислены возможные
|
||
формы команды.</p>
|
||
|
||
<dl>
|
||
<dt><em>slave</em> <strong>aliases</strong></dt>
|
||
|
||
<dd>Возвращает список всех алиасов в подчиненном интерпретаторе
|
||
<em>slave</em>. Возвращаемые имена - это имена,
|
||
использовавшиеся при создании соответствующих алиасов. Они
|
||
могут не совпадать с текущими именами команд, если те были
|
||
переименованы.
|
||
</dd>
|
||
|
||
<dt> <em>slave</em> <strong>alias</strong> <em>srcCmd</em> </dt>
|
||
|
||
<dd> Возвращает список, состоящий из имени реальной команды и ее
|
||
аргументов, ассоциированных с алиасом <em>srcCmd</em>.
|
||
Возвращаются те же значения, что и в команде создания
|
||
алиаса. Если созданный алиас был переименован, то в команде
|
||
надо указывать имя <em>srcCmd</em>, которое использовалось при
|
||
создании алиаса.
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>alias</strong> <em>srcCmd</em> <em>{}</em></dt>
|
||
|
||
<dd> Удаляет алиас <em>srcCmd</em> в подчиненном интерпретаторе.
|
||
Аргумент <em>srcCmd</em> указывает имя алиаса в момент
|
||
создания. Если после этого он был переименован, удалится
|
||
переименованная команда.
|
||
</dd>
|
||
|
||
<dt> <em>slave</em> <strong>alias</strong> <em>srcCmd</em> <em>targetCmd</em>
|
||
?<em>arg</em>..?</dt>
|
||
|
||
<dd> Эта команда создает команду - алиас в подчиненном
|
||
интерпретаторе. Каждый раз, когда в подчиненном интерпретаторе
|
||
будет вызываться команда <em>srcCmd</em>, реально выполняться
|
||
будет команда <em>targetCmd</em> в
|
||
мастер-интерпретаторе. Аргументы <em>arg</em>, если они есть,
|
||
определяют дополнительные аргументы для команды
|
||
<em>targetCmd</em>, которые будут вставлены перед аргументами,
|
||
заданными при вызове <em>srcCmd</em>. Подробнее см. "<a
|
||
href="#ИСПОЛЬЗОВАНИЕ АЛИАСОВ">Использование
|
||
алиасов</a>".
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>eval</strong> <em>arg</em> ?<em>arg</em>..?</dt>
|
||
|
||
<dd>Эта команда объединяет все свои аргументы так же, как
|
||
команда <a href="concat.html"><strong>concat</strong></a>, и выполняет
|
||
сформированный таким образом скрипт в подчиненном
|
||
интерпретаторе. Результат выполнения (включая информацию об
|
||
ошибках в переменных <a href="tclvars.html#errorInfo">
|
||
<strong>errorInfo</strong></a> и <a
|
||
href="tclvars.html#errorCode"><strong>errorCode</strong></a>, если
|
||
произошла ошибка) возвращается в вызывающий интерпретатор.
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>expose</strong> <em>hiddenName</em>
|
||
?<em>exposedCmdName</em>?</dt>
|
||
|
||
<dd> Разрешает использование в подчиненном интерпретаторе
|
||
скрытой команды <em>hiddenName</em> под новым именем <em>
|
||
exposedCmdName</em> (в настоящее время поддерживаются только
|
||
имена в глобальном пространстве имен, не содержащие
|
||
"<strong>::</strong>"). Если обычная (не скрытая) команда
|
||
<em>exposedCmdName</em> уже существует, генерируется сообщение
|
||
об ошибке. Скрытые команды обсуждаются ниже (см. "<a href=
|
||
"#СКРЫТЫЕ КОМАНДЫ">Скрытые команды</a>").
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>hide</strong> <em>exposedCmdName</em>
|
||
?<em>hiddenCmdName</em>?</dt>
|
||
|
||
<dd>Запрещает использование в подчиненном интерпретаторе обычной
|
||
команды <em>exposedCmdName</em> и переименовывает ее в скрытую
|
||
команду <em>hiddenCmdName</em> (или в скрытую команду под старым
|
||
именем, если новое не было задано). Если скрытая команда с
|
||
заданным именем уже существует, команда возвращает ошибку. В
|
||
настоящее время <em>exposedCmdName</em> и <em>hiddenCmdName</em>
|
||
не могут содержать "<strong>::</strong>". Команды, которые
|
||
должны быть скрыты с помощью <strong>interp hide</strong>, ищутся только
|
||
в глобальном пространстве имен, даже если текущее пространство
|
||
имен не глобальное. Скрытые команды обсуждаются ниже
|
||
(см. "<a href="#СКРЫТЫЕ КОМАНДЫ">Скрытые
|
||
команды</a>").
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>hidden</strong></dt>
|
||
|
||
<dd>Возвращает список скрытых команд в подчиненном
|
||
интерпретаторе.
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>invokehidden</strong> ?<em>-global</em>?
|
||
<em>hiddenName</em> ?<em>arg</em>..?</dt>
|
||
|
||
<dd> Вызывает в подчиненном интерпретаторе скрытую команду
|
||
<em>hiddenCmdName</em> с перечисленными аргументами. Никаких
|
||
подстановок или вычислений в аргументах не производится. Если
|
||
указана опция <em>-global</em>, скрытая команда выполняется на
|
||
глобальном уровне в подчиненном интерпретаторе. В противном
|
||
случае она выполняется в текущем контексте и может
|
||
использовать значения локальных переменных и переменных из
|
||
вышестоящих стеков. Скрытые команды обсуждаются подробно в
|
||
соответствующем разделе ниже.
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>issafe</strong></dt>
|
||
|
||
<dd> Возвращает <strong>1</strong>, если подчиненный интерпретатор
|
||
безопасный, и <strong>0</strong> в противном случае.
|
||
</dd>
|
||
|
||
<dt><em>slave</em> <strong>marktrusted</strong></dt>
|
||
|
||
<dd>Отмечает подчиненный интерпретатор как надежный. Не
|
||
раскрывает скрытые команды. Команда может выполняться только
|
||
из надежного интерпретатора. Если подчиненный интерпретатор
|
||
уже надежный, команда не оказывает никакого воздействия.
|
||
</dd>
|
||
</dl>
|
||
|
||
<h2><a name="БЕЗОПАСНЫЕ ИНТЕРПРЕТАТОРЫ"></a>
|
||
БЕЗОПАСНЫЕ ИНТЕРПРЕТАТОРЫ</h2>
|
||
|
||
<p> Безопасный интерпретатор - это интерпретатор с ограниченной
|
||
функциональностью. Поэтому в нем можно без опасений выполнять
|
||
произвольные скрипты, даже написанные вашим злейшим врагом, не
|
||
опасаясь нарушить выполнение вашего приложения или испортить
|
||
содержимое дисков вашего компьютера. Чтобы обеспечить
|
||
безопасность, из таких интерпретаторов удалены определенные
|
||
команды и переменные. Например, команда создания файлов на диске
|
||
и команда запуска подпроцессов. Тем не менее, в безопасном
|
||
интерпретаторе можно обеспечить ограниченный доступ к подобным
|
||
командам с помощью механизма алиасов. В результате при
|
||
выполнении потенциально опасных команд будут вызываться
|
||
специально написанные процедуры в мастер-интерпретаторе, которые
|
||
могут тщательно проверять заданные аргументы и позволять
|
||
использовать только ограниченный набор средств. Например,
|
||
создание файлов может быть разрешено только в ограниченном
|
||
наборе подкаталогов, а запуск подпроцессов разрешен только для
|
||
ограниченного (и фиксированного) набора хорошо проверенных
|
||
программ.
|
||
</p>
|
||
|
||
<p> Чтобы создаваемый интерпретатор был безопасным, необходимо при
|
||
его создании указать опцию <strong>-safe</strong>. Кроме того, любой
|
||
интерпретатор, созданный из безопасного интерпретатора, также
|
||
будет безопасным.
|
||
</p>
|
||
|
||
<p> Безопасный интерпретатор создается со следующим набором
|
||
команд:</p>
|
||
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong><a href="after.html">after</a></strong></td>
|
||
<td><strong><a href="append.html">append</a></strong></td>
|
||
<td><strong><a href="array.html">array</a></strong></td>
|
||
<td><strong><a href="break.html">break</a></strong></td>
|
||
<td><strong><a href="case.html">case</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="catch.html">catch</a></strong></td>
|
||
<td><strong><a href="clock.html">clock</a></strong></td>
|
||
<td><strong><a href="concat.html">concat</a></strong></td>
|
||
<td><strong><a href="continue.html">continue</a></strong></td>
|
||
<td><strong><a href="eof.html">eof</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="error.html">error</a></strong></td>
|
||
<td><strong><a href="eval.html">eval</a></strong></td>
|
||
<td><strong><a href="expr.html">expr</a></strong></td>
|
||
<td><strong><a href="fblocked.html">fblocked</a></strong></td>
|
||
<td><strong><a href="fileevent.html">fileevent</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="flush.html">flush</a></strong></td>
|
||
<td><strong><a href="for.html">for</a></strong></td>
|
||
<td><strong><a href="foreach.html">foreach</a></strong></td>
|
||
<td><strong><a href="format.html">format</a></strong></td>
|
||
<td><strong><a href="gets.html">gets</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="global.html">global</a></strong></td>
|
||
<td><strong><a href="history.html">history</a></strong></td>
|
||
<td><strong><a href="if.html">if</a></strong></td>
|
||
<td><strong><a href="incr.html">incr</a></strong></td>
|
||
<td><strong><a href="info.html">info</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="interp.html">interp</a></strong></td>
|
||
<td><strong><a href="join.html">join</a></strong></td>
|
||
<td><strong><a href="lappend.html">lappend</a></strong></td>
|
||
<td><strong><a href="lindex.html">lindex</a></strong></td>
|
||
<td><strong><a href="linsert.html">linsert</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="list.html">list</a></strong></td>
|
||
<td><strong><a href="llength.html">llength</a></strong></td>
|
||
<td><strong><a href="lower.html">lower</a></strong></td>
|
||
<td><strong><a href="lrange.html">lrange</a></strong></td>
|
||
<td><strong><a href="lreplace.html">lreplace</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="lsearch.html">lsearch</a></strong></td>
|
||
<td><strong><a href="lsort.html">lsort</a></strong></td>
|
||
<td><strong><a href="package.html">package</a></strong></td>
|
||
<td><strong><a href="pid.html">pid</a></strong></td>
|
||
<td><strong><a href="proc.html">proc</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="puts.html">puts</a></strong></td>
|
||
<td><strong><a href="read.html">read</a></strong></td>
|
||
<td><strong><a href="rename.html">rename</a></strong></td>
|
||
<td><strong><a href="return.html">return</a></strong></td>
|
||
<td><strong><a href="scan.html">scan</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="seek.html">seek</a></strong></td>
|
||
<td><strong><a href="seek.html">set</a></strong></td>
|
||
<td><strong><a href="split.html">split</a></strong></td>
|
||
<td><strong><a href="string.html">string</a></strong></td>
|
||
<td><strong><a href="subst.html">subst</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="switch.html">switch</a></strong></td>
|
||
<td><strong><a href="tell.html">tell</a></strong></td>
|
||
<td><strong><a href="trace.html">trace</a></strong></td>
|
||
<td><strong><a href="unset.html">unset</a></strong></td>
|
||
<td><strong><a href="update.html">update</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="uplevel.html">uplevel</a></strong></td>
|
||
<td><strong><a href="upvar.html">upvar</a></strong></td>
|
||
<td><strong><a href="vwait.html">vwait</a></strong></td>
|
||
<td><strong><a href="while.html">while</a></strong></td>
|
||
<td></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p>Следующие команды в безопасном интерпретаторе скрыты:</p>
|
||
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong><a href="cd.html">cd</a></strong></td>
|
||
<td><strong><a href="exec.html">exec</a></strong></td>
|
||
<td><strong><a href="exit.html">exit</a></strong></td>
|
||
<td><strong><a href="fconfigure.html">fconfigure</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="file.html">file</a></strong></td>
|
||
<td><strong><a href="glob.html">glob</a></strong></td>
|
||
<td><strong><a href="load.html">load</a></strong></td>
|
||
<td><strong><a href="open.html">open</a></strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong><a href="pwd.html">pwd</a></strong></td>
|
||
<td><strong><a href="socket.html">socket</a></strong></td>
|
||
<td><strong><a href="source.html">source</a></strong></td>
|
||
<td></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p>Эти команды могут быть созданы заново как Tcl-процедуры или
|
||
алиасы или разрешены к использованию с помощью команды <a
|
||
href="interp.html#expose"><strong>interp expose</strong></a>.</p>
|
||
|
||
<p>Сверх того, в безопасных интерпретаторах отсутствует массив
|
||
<a href="tclvars.html#env"><strong>env</strong></a>, содержащий обычно
|
||
переменные окружения. Это связано с тем, что в переменных
|
||
окружения может храниться конфиденциальная информация.</p>
|
||
|
||
<p>Расширения, загружаемые в безопасный интерпретатор, также
|
||
обладают ограниченной функциональностью. Более подробно эти
|
||
вопросы обсуждаются в пп. <a
|
||
href="SafeTcl.html"><strong>SafeTcl</strong></a> и <a
|
||
href="load.html"><strong>load</strong></a>.
|
||
</p>
|
||
|
||
<h2><a name="ИСПОЛЬЗОВАНИЕ АЛИАСОВ"></a>ИСПОЛЬЗОВАНИЕ
|
||
АЛИАСОВ</h2>
|
||
|
||
<p> Механизм алиасов весьма тщательно спроектирован таким образом,
|
||
чтобы он позволял без опасений выполнять ненадежные скрипты в
|
||
безопасных подчиненных интерпретаторах, используя для алиасов
|
||
проверенные команды в мастер-интерпретаторах. Для обеспечения
|
||
безопасности принципиально важно, чтобы информация из
|
||
подчиненного интерпретатора никогда не обрабатывалась (то есть
|
||
скрипты не исполнялись, и в них не производились подстановки) в
|
||
мастер-интерпретаторе. В противном случае всегда будет
|
||
оставаться возможность написать такой скрипт для подчиненного
|
||
интерпретатора, который выполнил бы произвольные действия в
|
||
мастер-интерпретаторе и мог бы нарушить его безопасность.</p>
|
||
|
||
<p>Когда в подчиненном интерпретаторе вызывается команда-алиас,
|
||
необходимые Tcl-подстановки в аргументах выполняются там же, как
|
||
для обычной Tcl-команды. После этого аргументы объединяются с
|
||
целевой командой и ее аргументами, определенными при создании
|
||
алиаса. Так, если команда вызова алиаса имела вид <em>``srcCmd
|
||
arg1 arg2... argN''</em>, то сформируется команда <em>``targetCmd
|
||
arg arg... arg arg1 arg2... argN''</em>, где <em>arg
|
||
arg... arg</em> - аргументы, указанные при создании
|
||
алиаса. После этого сформированная команда выполняется в целевом
|
||
интерпретаторе (со сформированным набором аргументов). Если в
|
||
целевом интерпретаторе нет команды <em>targetCmd</em>, будет
|
||
сгенерирована ошибка. Перед выполнением команды в целевом
|
||
интерпретаторе больше никаких подстановок в аргументах
|
||
произведено не будет. Команда будет вызвана напрямую, а не через
|
||
обычный механизм выполнения. Таким образом, подстановки в каждом
|
||
слове команды оказываются выполненными ровно один раз: в
|
||
<em>targetCmd</em> и <em>arg... arg</em> - при выполнении команды,
|
||
с помощью которой был создан алиас, а в <em>arg1 - argN</em> - при
|
||
анализе команды алиаса в соответствующем интерпретаторе.</p>
|
||
|
||
<p>При написании процедуры <em>targetCmd</em>, которую
|
||
предполагается использовать для алиаса в безопасном
|
||
интерпретаторе, нужно придерживаться следующего правила.
|
||
Недопустимо, чтобы в значениях ее аргументов в теле процедуры
|
||
производились подстановки, либо чтобы аргументы были скриптами,
|
||
исполняемыми в теле процедуры. Нарушение этого правила дает
|
||
возможность подчиненному интерпретатору выполнить произвольный
|
||
код в мастер-интерпретаторе и нарушить, таким образом,
|
||
безопасность системы.</p>
|
||
|
||
<h2><a name="СКРЫТЫЕ КОМАНДЫ"></a>СКРЫТЫЕ КОМАНДЫ</h2>
|
||
|
||
<p> Безопасные интерпретаторы существенно ограничивают
|
||
функциональные возможности выполняемых в них Tcl-скриптов. С
|
||
одной стороны, это позволяет избежать нежелательных последствий
|
||
при их исполнении, но, с другой стороны, рано или поздно
|
||
возникает насущная необходимость выполнить потенциально опасную
|
||
команду в безопасном интерпретаторе. Например, прочитать
|
||
дополнительный скрипт с помощью команды <a
|
||
href="source.html"><strong>source</strong></a>. Или выполнить в
|
||
Tk-приложении некоторые команды управления окнами.</p>
|
||
|
||
<p>Команда <strong>interp</strong> обеспечивает решение этой проблемы с
|
||
помощью механизма скрытых команд. Потенциально опасные команды
|
||
не удаляются из безопасного интерпретатора, а становятся
|
||
скрытыми. При этом их невозможно выполнить из скрипта,
|
||
выполняемого "внутри" интерпретатора. Но их можно выполнить
|
||
"извне" из любого надежного предка интерпретатора с помощью
|
||
команды <strong>interp invoke</strong>. Скрытые и обычные (не скрытые)
|
||
команды размещаются в различных пространствах имен. Это
|
||
позволяет иметь в одном интерпретаторе скрытую и обычную команды
|
||
с одним и тем же именем.</p>
|
||
|
||
<p>Скрытые команды могут использоваться в теле процедуры,
|
||
использованной при определении алиаса. Например, в подчиненном
|
||
интерпретаторе можно создать алиас source. Вызываемая при этом
|
||
процедура в мастер-интерпретаторе проверяет допустимость
|
||
запрошенной операции (например, что запрошенный файл находится в
|
||
соответствующем каталоге, к которому разрешен доступ из
|
||
подчиненного интерпретатора) и вызывает в подчиненном
|
||
интерпретаторе скрытую команду <a
|
||
href="source.html"><strong>source</strong></a>. Обратите внимание, что
|
||
в этом случае в подчиненном интерпретаторе существует две
|
||
команды <a href="source.html"><strong>source</strong></a>: скрытая и
|
||
алиас.</p>
|
||
|
||
<p>Из мастер-интерпретатора возможен вызов скрытых команд
|
||
подчиненного интерпретатора через механизм алиасов. Поэтому в
|
||
теле процедур, предназначенных для создания алиаса, необходимо
|
||
избегать подстановок и команд исполнения для
|
||
аргументов. См. "<a href=
|
||
"#ИСПОЛЬЗОВАНИЕ АЛИАСОВ">Использование алиасов</a>".</p>
|
||
|
||
<p>Безопасные интерпретаторы не могут "изнутри" вызвать скрытую
|
||
команду в себе или своих потомках.</p>
|
||
|
||
<p>Множество скрытых команд может быть изменено из надежного
|
||
интерпретатора с помощью команд <a href="#expose"><strong>interp
|
||
expose</strong></a> и <a href="#hide"><strong>interp
|
||
hide</strong></a>. Безопасный интерпретатор не может изменить набор
|
||
скрытых команд в себе или своих потомках.</p>
|
||
|
||
<p>В настоящее время имена скрытых команд не могут содержать имени
|
||
пространства имен. Поэтому, прежде чем скрыть команду, ее надо
|
||
перевести в глобальное пространство имен. Команды, которые
|
||
необходимо скрыть, должны находиться в глобальном пространстве
|
||
имен. Это позволяет избежать ошибочного скрытия одноименной
|
||
команды из другого пространства имен.</p>
|
||
</body>
|
||
</html>
|