Как вызывать команды bash из tcl-скрипта? - PullRequest
5 голосов
/ 07 ноября 2010

Команды Bash доступны в интерактивном сеансе tclsh. Например. в сеансе tclsh вы можете иметь

% ls

вместо

$ exec ls

Однако у вас не может быть tcl-скрипта, который напрямую вызывает команды bash (т.е. без exec).

Как заставить tclsh распознавать команды bash при интерпретации файлов сценариев tcl, как это происходит в интерактивном сеансе?

Я предполагаю, что есть некоторый пакет tcl (или что-то в этом роде), который загружается автоматически при запуске интерактивного сеанса для поддержки прямых вызовов команд bash. Как я могу загрузить его вручную в файлы сценариев tcl?

Ответы [ 3 ]

10 голосов
/ 07 ноября 2010

Если вы хотите, чтобы в ваших скриптах были доступны специальные утилиты, напишите процедуры моста:

proc ls args {
    exec {*}[auto_execok ls] {*}$args
}

Это будет работать (с очевидной адаптацией) для большинства встроенных оболочек или в Windows,(Чтобы быть справедливым, вы обычно не хотите использовать внешнюю ls; обычно внутренней glob команды достаточно, иногда с дополнительной помощью некоторых подкоманд file.) Некоторым командам требуется немного больше работы (например, перенаправление ввода, чтобы оно поступало с терминала, с дополнительными <@stdin или </dev/tty; это необходимо для stty на некоторых платформах), но это работает достаточно хорошо.

Однако, если вы запрашиваете произвольное выполнение внешних программ без какого-либо дополнительного кода, чтобы отметить, что они являются внешними, это считается противоречащим идеалу Tcl.Проблема в том, что это делает код довольно сложным в обслуживании;не очевидно, что вы делаете дорогой вызов вместо того, чтобы использовать что-то (относительно) дешевое, внутреннее.Ввод exec в этом случае не , что обременительно…

7 голосов
/ 07 ноября 2010

Здесь происходит то, что процесс unknown вызывается, когда вы набираете команду типа ls, потому что это не существующая команда tcl, и по умолчанию эта команда проверит, что если команда была вызвана изинтерактивный сеанс и от верхнего уровня (не косвенно в теле proc), и он проверяет, существует ли имя proc где-то на пути.Вы можете получить что-то вроде этого, написав свой собственный неизвестный процесс.

Чтобы хорошо начать, изучите вывод

info body unknown
4 голосов
/ 07 ноября 2010

Одна вещь, которую вы должны знать, это то, что ls не является командой Bash. Это отдельная утилита. Ключ к пониманию того, как tclsh запускает такие утилиты, находится в его названии - sh означает «shell». Так что это грубый эквивалент Bash в том смысле, что Bash также является оболочкой. Tcl! = Tclsh, поэтому вы должны использовать exec.

...