Команда unknown обрабатывает попытки обратиться к несуществующей команде.
unknown cmdName ?arg arg?
Интерпретатор Tcl выполняет эту команду каждый раз, когда скрипт пытается обратиться к несуществующей команде. Исходный вариант unknown не является функцией ядра Tcl; напротив, это библиотечная процедура, определяемая по умолчанию при запуске Tcl. Разработчик может переопределить ее функциональность так, как ему нужно.
Когда Tcl находит имя команды, которому не соответствует ни одной из существующих команд, тогда он проверяет наличие команды unknown. Если команды unknown нет, то он возвращает ошибку. Если такая команда обнаружена, то она будет вызвана с аргументами, состоящими из имени и аргументов исходной несуществующей команды, в которых выполнены все необходимые подстановки.
Команда unknown обычно выполняет поиск по библиотечным каталогам процедуры с именем cmdName, или поиск полного имени команды, к которой обратились по сокращенному имени, или автоматический запуск неизвестной команды как подпроцесса. При успешном поиске полного имени команды команда unknown заменяет имя на полное и вызывает команду с полным именем. Результат работы команды unknown используется вместо результата неопределенной команды.
Создаваемая по умолчанию процедура unknown выполняет следующие действия.
Сначала она вызывает библиотечную процедуру auto_load чтобы найти и загрузить соответствующую процедуру. Если это удалось, то выполняется исходная команда с ее исходными аргументами.
В противном случае вызывается процедура auto_execok чтобы найти исполняемый файл с именем cmdName. Если файл удалось найти, выполняется команда exec с именем команды и ее аргументами в качестве аргументов.
В противном случае проверяется, была ли неизвестная команда вызвана на самом верхнем уровне вне какого-либо скрипта. Если это было так, процедура unknown выполняет следующие дополнительные действия: проверяется не имеет ли команда одну из следующих форм:!!, !event, или ^old^new?^? и если да, то процедура unknown выполняет для них подстановки по тем же правилам, что и csh.
И при неудаче всех предыдущих попыток процедура unknown проверяет, не является ли cmdName сокращением для известной Tcl процедуры. Если так, то cmdName заменяется на полное имя процедуры и она вызывается с исходными аргументами.
Если же ни одна из попыток не привела к успеху, процедура возвращает ошибку.
Если определена глобальная переменная auto_noload, попытка загрузить процедуру с помощью auto_load не производится.
Если определена глобальная переменная auto_noexec, попытка загрузить процедуру с помощью auto_execok не производится.
Если команду удалось найти, то процедура unknown возвращает результат выполнения найденной команды.