"exec source <script>" не работает в tcl - PullRequest
2 голосов
/ 22 февраля 2010

Я пытаюсь вызвать скрипт в Tcl с помощью команды:

exec source <script path>

и получаю ошибку

couldn't execute "source": no such file or directory

Как я могу вызвать другой скрипт из tcl?

Редактировать: я выполняю команду, полученную от другого человека в моем офисе.Мне было поручено явно запустить «источник» с источником.Другими словами, как мне запустить любую команду, которая будет работать в cshell, в Tcl?

Ответы [ 6 ]

7 голосов
/ 22 февраля 2010

Если предоставленный вами скрипт является скриптом cshell, вы можете выполнить его следующим образом:

exec /bin/csh $path_to_script

По сути, именно это и делает команда «source» из интерактивной оболочки. Не ясно, действительно ли это то, что вы хотите сделать или нет (не совсем, но достаточно близко для этого обсуждения).

Причина, по которой вы не можете выполнить исходную команду, заключается в том, что exec будет работать только с исполняемыми файлами (отсюда и название 'exec'). Исходная команда не реализована в виде исполняемого файла, это команда, встроенная в оболочку. Таким образом, это не может быть exec'd.

Если вы действительно чувствуете необходимость выполнить исходную команду или любую другую встроенную команду, вы можете сделать что-то вроде этого:

exec /bin/csh -c "source $path_to_script"

В приведенном выше примере вы используете оболочку c и просите ее выполнить команду «source». Для конкретного случая исходной команды это не имеет особого смысла.

Однако я не уверен, что все это действительно сделает то, что вы ожидаете. Обычно, если кто-то говорит «вот некоторые команды, просто сделайте« source », он обычно просто определяет некоторые псевдонимы и тому подобное, которые будут использоваться в интерактивной оболочке. Эти псевдонимы не будут работать в Tcl.

3 голосов
/ 22 февраля 2010

source в csh, как . в bash, выполняет сценарий, не вызывая новый процесс.

В результате любая переменная, заданная в этом сценарии, будет доступна в текущем сеансе csh.

На самом деле, source является встроенной командой csh, поэтому недоступна из tcl exec, и использование exec без source не даст определенного source эффекта.

Нет простого способа решить вашу проблему.

1 голос
/ 22 февраля 2010

Некоторая путаница здесь. exec запускает отдельную программу, возможно, с аргументами. source - это не отдельная программа, это другая команда Tcl, которая читает файл команд Tcl и выполняет их, но не передает аргументы. Если другой скрипт, который вы пытаетесь вызвать, написан для запуска из командной строки, он будет ожидать найти свои аргументы в виде списка в переменной argv. Вы можете подделать это, установив argv в список аргументов перед запуском source, например.

set argv {first_arg second_arg}
source script_path

В качестве альтернативы вы можете использовать exec для запуска всего отдельного исполняемого файла Tcl и передать ему скрипт и аргументы:

exec script_path first_arg second_arg
1 голос
/ 22 февраля 2010

исходная загрузка исходного файла

вы должны сделать:

source <script path>

Если вы хотите выполнить его, вам нужно вызвать основной процесс.

другой вариант будет делать:

exec [info nameofexecutable] <scritp path>
0 голосов
/ 18 июня 2013

Недавно я хотел установить некоторые переменные среды UNIX, используя сценарий оболочки, и наткнулся на ту же проблему. Я нашел это простое решение, которое идеально подходит для меня:

Просто используйте небольшой 3-строчный скрипт-обертку, который выполняет исходную команду в оболочке UNIX до вашего Tcl-скрипта. Пример:

#!/bin/csh
source SetMyEnvironment.csh
tclsh MyScript.tcl
0 голосов
/ 22 февраля 2010

ошибка говорит сама за себя. Убедитесь, что вы указали правильный путь, при необходимости укажите полный путь. и убедитесь, что файл действительно существует в этом каталоге

...