2018-02-05 17:22:04 +03:00
|
|
|
|
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>interp</title>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
<h1>interp</h1>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Команда создает и управляет Tcl-интерпретаторами. </p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>СИНТАКСИС</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<strong>interp</strong> <em>option</em> ?<em>arg</em> <em>arg</em>...?
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
|
|
|
|
|
|
|
|
|
<p>Эта команда позволяет создавать один или несколько новых
|
|
|
|
|
Tcl-интерпретаторов, которые сосуществуют в одном приложении с
|
|
|
|
|
создавшим их интерпретатором. Создавший интерпретатор называется
|
|
|
|
|
мастер-интерпретатором, а созданные интерпретаторы называются
|
|
|
|
|
подчиненными (<em>slave</em>) интерпретаторами.
|
|
|
|
|
Мастер-интерпретатор может создавать произвольное число
|
|
|
|
|
подчиненных интерпретаторов, а каждый из подчиненных может в
|
|
|
|
|
свою очередь создавать подчиненные интерпретаторы, для которых
|
|
|
|
|
он сам является мастер-интерпретатором. В результате в
|
|
|
|
|
приложении может создаваться иерархия интерпретаторов.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Каждый интерпретатор независим от остальных. Он имеет
|
|
|
|
|
собственное пространство имен для команд, процедур и глобальных
|
|
|
|
|
переменных. Мастер-интерпретатор может создавать связи между
|
|
|
|
|
подчиненными интерпретаторами и собой, используя механизм
|
|
|
|
|
алиасов. Алиас - это команда в подчиненном интерпретаторе,
|
|
|
|
|
которая, при ее вызове, вызывает другую команду в
|
|
|
|
|
мастер-интерпретаторе или в другом подчиненном
|
|
|
|
|
интерпретаторе. Кроме механизма алиасов, связь между
|
|
|
|
|
интерпретаторами поддерживается только через переменные
|
|
|
|
|
окружения. Массив <a
|
|
|
|
|
href=tclvars.html#env><strong>env</strong></a>>обычно является общим для
|
|
|
|
|
всех интерпретаторов в приложении. Необходимо заметить, что
|
|
|
|
|
идентификаторы каналов (например, идентификатор, возвращаемый
|
|
|
|
|
командой <a href= open.html><strong>open</strong></a>) больше не
|
|
|
|
|
разделяются между интерпретаторами, как это было в предыдущих
|
|
|
|
|
версиях Tcl. Чтобы обеспечить совместный доступ к каналам,
|
|
|
|
|
необходимо использовать явные команды для передачи
|
|
|
|
|
идентификаторов каналов из интерпретатора в интерпретатор.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда <strong>interp</strong> позволяет также создавать надежные
|
|
|
|
|
интерпретаторы. Надежный интерпретатор - это интерпретатор с
|
|
|
|
|
существенно урезанной функциональностью, поэтому он может
|
|
|
|
|
исполнять ненадежные скрипты без риска нарушить работу
|
|
|
|
|
вызывающего их приложения. Например, из безопасных
|
|
|
|
|
интерпретаторов недоступны команды создания каналов и
|
|
|
|
|
подпроцессов. Более подробно см. <a href=
|
|
|
|
|
#БЕЗОПАСНЫЕ>Безопасные интерпретаторы</a>. Опасная
|
|
|
|
|
функциональность не удалена из безопасных интерпретаторов, но
|
|
|
|
|
скрыта таким образом, что только надежные интерпретаторы могут
|
|
|
|
|
получить к ней доступ. Более подробно см. <a href=
|
|
|
|
|
#СКРЫТЫЕ КОМАНДЫ>Скрытые команды</a>. Механизм
|
|
|
|
|
алиасов может быть использован для безопасного взаимодействия
|
|
|
|
|
между подчиненным интерпретатором и его
|
|
|
|
|
мастер-интерпретатором. Более подробно этот вопрос обсуждается в
|
|
|
|
|
разделе "<a
|
|
|
|
|
href=#ИСПОЛЬЗОВАНИЕ АЛИАСОВ>Использование алиасов</a>".
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Полное имя интерпретатора представляет собой список, содержащий
|
|
|
|
|
имена его предков в иерархии интерпретаторов и заканчивающийся
|
|
|
|
|
именем интерпретатора в его непосредственном предке. Имена
|
|
|
|
|
интерпретаторов в списке - это их относительные имена в их
|
|
|
|
|
непосредственных мастер-интерпретаторах. Например, если <strong>a</strong>
|
|
|
|
|
есть подчиненный интерпретатор текущего интерпретатора и, в свою
|
|
|
|
|
очередь, имеет подчиненный интерпретатор <strong>a1</strong>, а тот, в
|
|
|
|
|
свою очередь, имеет подчиненный интерпретатор <strong>a11</strong>, то
|
|
|
|
|
полное имя <strong>a11</strong> в <strong>a</strong> есть список <strong>{a1 a11}</strong>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>В качестве аргумента описанной ниже команды <strong>interp</strong>
|
|
|
|
|
используется полное имя интерпретатора. Интерпретатор, в котором
|
|
|
|
|
исполняется команда, всегда обозначается как <strong>{}</strong> (пустая
|
|
|
|
|
строка). Обратите внимание, что в подчиненном интерпретаторе
|
|
|
|
|
невозможно сослаться на мастер-интерпретатор кроме как через
|
|
|
|
|
алиасы. Также нет никакого имени, под которому можно было бы
|
|
|
|
|
сослаться на мастер-интерпретатор, первым созданный в
|
|
|
|
|
приложении. Оба ограничения вызваны соображениями безопасности.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>КОМАНДА INTERP</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Команда <strong>interp</strong> используется для создания, удаления и
|
|
|
|
|
выполнения команд в подчиненном интерпретаторе, а также для
|
|
|
|
|
разделения или передачи каналов между интерпретаторами. Она
|
|
|
|
|
может иметь одну из перечисленных ниже форм в зависимости от
|
|
|
|
|
значения аргумента <em>option</em>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<dl>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt> <a name=alias></a><strong>interp</strong> <strong>alias</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>srcPath</em> <em>srcCmd</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает список, состоящий из исходной команды и
|
|
|
|
|
аргументов, связанных с алиасом <em>srcCmd</em> в интерпретаторе
|
|
|
|
|
<em>srcPath</em> (возвращаются значения, использовавшиеся при
|
|
|
|
|
создании алиаса, так как имя команды могло быть изменено с
|
|
|
|
|
помощью команды <a href= rename.html><strong>rename</strong></a>).
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>alias</strong> <em>srcPath</em> <em>srcCmd</em>
|
|
|
|
|
<em>{}</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Удаляет алиас <em>srcCmd</em> в подчиненном интерпретаторе
|
|
|
|
|
<em>srcPath</em>. Имя <em>srcCmd</em> - это имя, под которым алиас
|
|
|
|
|
был создан. Если созданная команда была переименована, то
|
|
|
|
|
будет удалена переименованная команда.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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> может как
|
|
|
|
|
существовать, так и не существовать в момент создания
|
|
|
|
|
алиаса. В последнем случае она не создается командой
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<strong>interp alias.</strong></p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Алиас позволяет использовать команду <em>targetCmd</em> в
|
|
|
|
|
интерпретаторе <em>targetPath</em> каждый раз, когда
|
|
|
|
|
вызывается команда-алиас<em>srcCmd</em> в интерпретаторе <em>
|
|
|
|
|
srcPath</em>. Подробнее см. "Использование алиасов".
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>aliases</strong> ?<em>path</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Эта команда возвращает список имен всех команд-алиасов,
|
|
|
|
|
определенных в интерпретаторе <em>path</em>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>create</strong> ?<em>-safe</em>? ?<em>--</em>?
|
|
|
|
|
?<em>path</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>delete</strong> ?<em>path</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Удаляет ноль или больше интерпретаторов с именем
|
|
|
|
|
<em>path</em>. Для каждого удаляемого интерпретатора удаляются
|
|
|
|
|
также его подчиненные интерпретаторы. Если для одного из
|
|
|
|
|
аргументов <em>path</em> интерпретатора с таким именем не
|
|
|
|
|
существует, команда генерирует ошибку.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>eval</strong> <em>path</em> <em>arg</em>
|
|
|
|
|
?<em>arg</em>...? </dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>, если произошла
|
|
|
|
|
ошибка) возвращается в вызывающий интерпретатор.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=exists></a><strong>interp</strong> <strong>exists</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>path</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Возвращает <strong>1</strong>, если подчиненный интерпретатор с
|
|
|
|
|
именем <em>path</em> существует в его мастер-интерпретаторе. В
|
|
|
|
|
противном случае возвращает <strong>0</strong>. Если аргумент
|
|
|
|
|
<em>path</em> представляет относительное имя, то он ищется в том
|
|
|
|
|
интерпретаторе, в котором выполняется команда.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=expose></a><strong>interp</strong> <strong>expose</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>path</em> <em>hiddenName</em> ?<em>exposedCmdName</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Разрешает использование в интерпретаторе <em>path</em>
|
|
|
|
|
скрытой команды <em>hiddenName</em> под новым именем
|
|
|
|
|
<em>exposedCmdName</em> (в настоящее время поддерживаются только
|
|
|
|
|
имена в глобальном пространстве имен, не содержащие
|
|
|
|
|
"<strong>::</strong>"). Если обычная (не скрытая) команда
|
|
|
|
|
<em>exposedCmdName</em> уже существует, генерируется сообщение
|
|
|
|
|
об ошибке. Скрытые команды обсуждаются подробно см. "<a
|
|
|
|
|
href=#СКРЫТЫЕ КОМАНДЫ>Скрытые команды</a>".
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=hide></a><strong>interp</strong> <strong>hide</strong> <em>path</em>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>exposedCmdName</em> ?<em>hiddenCmdName</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>").
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>hidden</strong> <em>path</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает список скрытых команд интерпретатора
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>path</em>.
|
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>invokehidden</strong> <em>path</em>
|
|
|
|
|
?<em>-global</em>? <em>hiddenCmdName</em> ?<em>arg</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Вызывает в интерпретаторе <em>path</em> скрытую команду
|
|
|
|
|
<em>hiddenCmdName</em> с перечисленными аргументами. Никаких
|
|
|
|
|
подстановок или вычислений в аргументах не производится. Если
|
|
|
|
|
указана опция <em>-global</em>, скрытая команда выполняется на
|
|
|
|
|
глобальном уровне в целевом интерпретаторе. В противном
|
|
|
|
|
случае она выполняется в текущем контексте и может
|
|
|
|
|
использовать значения локальных переменных и переменных из
|
|
|
|
|
вышестоящих стеков. Скрытые команды обсуждаются подробно в
|
|
|
|
|
соответствующем разделе ниже.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>issafe</strong> ?<em>path</em>? </dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает <strong>1</strong>, если интерпретатор <em>path</em>
|
|
|
|
|
безопасный, и <strong>0</strong> в противном случае.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>marktrusted</strong> <em>path</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Отмечает интерпретатор <em>path</em> как надежный. Не
|
|
|
|
|
раскрывает скрытые команды. Команда <strong>interp marktrusted</strong>
|
|
|
|
|
может выполняться только из надежного интерпретатора. Если
|
|
|
|
|
интерпретатор <em>path</em> уже надежный, команда не оказывает
|
|
|
|
|
никакого воздействия.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>share</strong> <em>srcPath</em> <em>channelId</em>
|
|
|
|
|
<em>destPath</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Позволяет разделить канал ввода - вывода <em>channelId</em>
|
|
|
|
|
между интерпретаторами <em>srcPath</em> и <em>destPath</em>. Оба
|
|
|
|
|
интерпретатора после этого будут иметь одинаковые права на
|
|
|
|
|
канал. Каналы ввода - вывода, доступные в интерпретаторе,
|
|
|
|
|
автоматически закрываются, когда удаляется интерпретатор.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>slaves</strong> ?<em>path</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает список подчиненных интерпретаторов для
|
|
|
|
|
интерпретатора <em>path</em>. Если аргумент <em>path</em>
|
|
|
|
|
отсутствует, возвращает список подчиненных интерпретаторов для
|
|
|
|
|
интерпретатора, в котором выполняется команда.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>target</strong> <em>path</em> <em>alias</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Возвращает список, описывающий целевой интерпретатор
|
|
|
|
|
(интерпретатор, в котором выполняется реальная команда при
|
|
|
|
|
вызове команды-алиаса) для алиаса <em>alias</em>. Алиас задается
|
|
|
|
|
именем интерпретатора <em>path</em> и команды-алиаса
|
|
|
|
|
<em>alias</em> как в команде <strong>interp alias</strong> выше. Имя
|
|
|
|
|
целевого интерпретатора возвращается как имя интерпретатора
|
|
|
|
|
относительно имени интерпретатора, в котором выполняется
|
|
|
|
|
команда. Если это текущий интерпретатор, то возвращается
|
|
|
|
|
пустой список. Если этот интерпретатор не является потомком
|
|
|
|
|
интерпретатора, в котором выполняется команда, генерируется
|
|
|
|
|
ошибка. Реальная команда не обязана быть определена в момент
|
|
|
|
|
выполнения данной команды.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>interp</strong> <strong>transfer</strong> <em>srcPath</em>
|
|
|
|
|
<em>channelId</em> <em>destPath</em> </dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Делает канал ввода - вывода <em>channelId</em> доступным в
|
|
|
|
|
интерпретаторе <em>destPath</em> и недоступным в интерпретаторе
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>srcPath</em>.
|
|
|
|
|
</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=КОМАНДА РАБОТЫ С ИНТЕРПРЕТАТОРОМ></a>КОМАНДА РАБОТЫ С
|
|
|
|
|
ИНТЕРПРЕТАТОРОМ (ПОДЧИНЕННАЯ КОМАНДА)</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Для каждого подчиненного интерпретатора, созданного с помощью
|
|
|
|
|
команды <strong>interp</strong>, в мастер-интерпретаторе создается команда
|
|
|
|
|
с тем же именем, что и подчиненный интерпретатор. Эта команда
|
|
|
|
|
предназначена для выполнения различных операций в подчиненном
|
|
|
|
|
интерпретаторе. В общем случае она имеет следующий вид:
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
slave command ?arg arg...?
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>где <em>slave</em> - имя подчиненного интерпретатора, а
|
|
|
|
|
аргументы <em>command</em> и <em>arg</em> <em>arg</em>... определяют
|
|
|
|
|
конкретное назначение команды. Ниже перечислены возможные
|
|
|
|
|
формы команды.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><em>slave</em> <strong>aliases</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает список всех алиасов в подчиненном интерпретаторе
|
|
|
|
|
<em>slave</em>. Возвращаемые имена - это имена,
|
|
|
|
|
использовавшиеся при создании соответствующих алиасов. Они
|
|
|
|
|
могут не совпадать с текущими именами команд, если те были
|
|
|
|
|
переименованы.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt> <em>slave</em> <strong>alias</strong> <em>srcCmd</em> </dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Возвращает список, состоящий из имени реальной команды и ее
|
|
|
|
|
аргументов, ассоциированных с алиасом <em>srcCmd</em>.
|
|
|
|
|
Возвращаются те же значения, что и в команде создания
|
|
|
|
|
алиаса. Если созданный алиас был переименован, то в команде
|
|
|
|
|
надо указывать имя <em>srcCmd</em>, которое использовалось при
|
|
|
|
|
создании алиаса.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>alias</strong> <em>srcCmd</em> <em>{}</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Удаляет алиас <em>srcCmd</em> в подчиненном интерпретаторе.
|
|
|
|
|
Аргумент <em>srcCmd</em> указывает имя алиаса в момент
|
|
|
|
|
создания. Если после этого он был переименован, удалится
|
|
|
|
|
переименованная команда.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt> <em>slave</em> <strong>alias</strong> <em>srcCmd</em> <em>targetCmd</em>
|
|
|
|
|
?<em>arg</em>..?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Эта команда создает команду - алиас в подчиненном
|
|
|
|
|
интерпретаторе. Каждый раз, когда в подчиненном интерпретаторе
|
|
|
|
|
будет вызываться команда <em>srcCmd</em>, реально выполняться
|
|
|
|
|
будет команда <em>targetCmd</em> в
|
|
|
|
|
мастер-интерпретаторе. Аргументы <em>arg</em>, если они есть,
|
|
|
|
|
определяют дополнительные аргументы для команды
|
|
|
|
|
<em>targetCmd</em>, которые будут вставлены перед аргументами,
|
|
|
|
|
заданными при вызове <em>srcCmd</em>. Подробнее см. "<a
|
|
|
|
|
href=#ИСПОЛЬЗОВАНИЕ АЛИАСОВ>Использование
|
|
|
|
|
алиасов</a>".
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>eval</strong> <em>arg</em> ?<em>arg</em>..?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>, если
|
|
|
|
|
произошла ошибка) возвращается в вызывающий интерпретатор.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>expose</strong> <em>hiddenName</em>
|
|
|
|
|
?<em>exposedCmdName</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Разрешает использование в подчиненном интерпретаторе
|
|
|
|
|
скрытой команды <em>hiddenName</em> под новым именем <em>
|
|
|
|
|
exposedCmdName</em> (в настоящее время поддерживаются только
|
|
|
|
|
имена в глобальном пространстве имен, не содержащие
|
|
|
|
|
"<strong>::</strong>"). Если обычная (не скрытая) команда
|
|
|
|
|
<em>exposedCmdName</em> уже существует, генерируется сообщение
|
|
|
|
|
об ошибке. Скрытые команды обсуждаются ниже (см. "<a href=
|
|
|
|
|
#СКРЫТЫЕ КОМАНДЫ>Скрытые команды</a>").
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>hide</strong> <em>exposedCmdName</em>
|
|
|
|
|
?<em>hiddenCmdName</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Запрещает использование в подчиненном интерпретаторе обычной
|
|
|
|
|
команды <em>exposedCmdName</em> и переименовывает ее в скрытую
|
|
|
|
|
команду <em>hiddenCmdName</em> (или в скрытую команду под старым
|
|
|
|
|
именем, если новое не было задано). Если скрытая команда с
|
|
|
|
|
заданным именем уже существует, команда возвращает ошибку. В
|
|
|
|
|
настоящее время <em>exposedCmdName</em> и <em>hiddenCmdName</em>
|
|
|
|
|
не могут содержать "<strong>::</strong>". Команды, которые
|
|
|
|
|
должны быть скрыты с помощью <strong>interp hide</strong>, ищутся только
|
|
|
|
|
в глобальном пространстве имен, даже если текущее пространство
|
|
|
|
|
имен не глобальное. Скрытые команды обсуждаются ниже
|
|
|
|
|
(см. "<a href=#СКРЫТЫЕ КОМАНДЫ>Скрытые
|
|
|
|
|
команды</a>").
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>hidden</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает список скрытых команд в подчиненном
|
|
|
|
|
интерпретаторе.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>invokehidden</strong> ?<em>-global</em>?
|
|
|
|
|
<em>hiddenName</em> ?<em>arg</em>..?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Вызывает в подчиненном интерпретаторе скрытую команду
|
|
|
|
|
<em>hiddenCmdName</em> с перечисленными аргументами. Никаких
|
|
|
|
|
подстановок или вычислений в аргументах не производится. Если
|
|
|
|
|
указана опция <em>-global</em>, скрытая команда выполняется на
|
|
|
|
|
глобальном уровне в подчиненном интерпретаторе. В противном
|
|
|
|
|
случае она выполняется в текущем контексте и может
|
|
|
|
|
использовать значения локальных переменных и переменных из
|
|
|
|
|
вышестоящих стеков. Скрытые команды обсуждаются подробно в
|
|
|
|
|
соответствующем разделе ниже.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>issafe</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Возвращает <strong>1</strong>, если подчиненный интерпретатор
|
|
|
|
|
безопасный, и <strong>0</strong> в противном случае.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><em>slave</em> <strong>marktrusted</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Отмечает подчиненный интерпретатор как надежный. Не
|
|
|
|
|
раскрывает скрытые команды. Команда может выполняться только
|
|
|
|
|
из надежного интерпретатора. Если подчиненный интерпретатор
|
|
|
|
|
уже надежный, команда не оказывает никакого воздействия.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=БЕЗОПАСНЫЕ ИНТЕРПРЕТАТОРЫ></a>
|
|
|
|
|
БЕЗОПАСНЫЕ ИНТЕРПРЕТАТОРЫ</h2>
|
|
|
|
|
|
|
|
|
|
<p> Безопасный интерпретатор - это интерпретатор с ограниченной
|
|
|
|
|
функциональностью. Поэтому в нем можно без опасений выполнять
|
|
|
|
|
произвольные скрипты, даже написанные вашим злейшим врагом, не
|
|
|
|
|
опасаясь нарушить выполнение вашего приложения или испортить
|
|
|
|
|
содержимое дисков вашего компьютера. Чтобы обеспечить
|
|
|
|
|
безопасность, из таких интерпретаторов удалены определенные
|
|
|
|
|
команды и переменные. Например, команда создания файлов на диске
|
|
|
|
|
и команда запуска подпроцессов. Тем не менее, в безопасном
|
|
|
|
|
интерпретаторе можно обеспечить ограниченный доступ к подобным
|
|
|
|
|
командам с помощью механизма алиасов. В результате при
|
|
|
|
|
выполнении потенциально опасных команд будут вызываться
|
|
|
|
|
специально написанные процедуры в мастер-интерпретаторе, которые
|
|
|
|
|
могут тщательно проверять заданные аргументы и позволять
|
|
|
|
|
использовать только ограниченный набор средств. Например,
|
|
|
|
|
создание файлов может быть разрешено только в ограниченном
|
|
|
|
|
наборе подкаталогов, а запуск подпроцессов разрешен только для
|
|
|
|
|
ограниченного (и фиксированного) набора хорошо проверенных
|
|
|
|
|
программ.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Чтобы создаваемый интерпретатор был безопасным, необходимо при
|
|
|
|
|
его создании указать опцию <strong>-safe</strong>. Кроме того, любой
|
|
|
|
|
интерпретатор, созданный из безопасного интерпретатора, также
|
|
|
|
|
будет безопасным.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Безопасный интерпретатор создается со следующим набором
|
|
|
|
|
команд:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<td></td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Следующие команды в безопасном интерпретаторе скрыты:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<td></td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Эти команды могут быть созданы заново как Tcl-процедуры или
|
|
|
|
|
алиасы или разрешены к использованию с помощью команды <a
|
|
|
|
|
href=interp.html#expose><strong>interp expose</strong></a>.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Сверх того, в безопасных интерпретаторах отсутствует массив
|
|
|
|
|
<a href=tclvars.html#env><strong>env</strong></a>, содержащий обычно
|
|
|
|
|
переменные окружения. Это связано с тем, что в переменных
|
|
|
|
|
окружения может храниться конфиденциальная информация.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Расширения, загружаемые в безопасный интерпретатор, также
|
|
|
|
|
обладают ограниченной функциональностью. Более подробно эти
|
|
|
|
|
вопросы обсуждаются в пп. <a
|
|
|
|
|
href=SafeTcl.html><strong>SafeTcl</strong></a> и <a
|
|
|
|
|
href=load.html><strong>load</strong></a>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=ИСПОЛЬЗОВАНИЕ АЛИАСОВ></a>ИСПОЛЬЗОВАНИЕ
|
|
|
|
|
АЛИАСОВ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>В настоящее время имена скрытых команд не могут содержать имени
|
|
|
|
|
пространства имен. Поэтому, прежде чем скрыть команду, ее надо
|
|
|
|
|
перевести в глобальное пространство имен. Команды, которые
|
|
|
|
|
необходимо скрыть, должны находиться в глобальном пространстве
|
|
|
|
|
имен. Это позволяет избежать ошибочного скрытия одноименной
|
|
|
|
|
команды из другого пространства имен.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</body>
|
|
|
|
|
</html>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|