2013-08-08 7 views
0

Нижеприведенная команда отлично работает, когда я запускаю ее из unix-бокса, но когда я выполняю ее из сценария tcl, она не работает. пожалуйста, помогите мне, как выполнить команду.Выполнение команды из сценария TCL

java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml 

Я попытался следующие строки кода

exec "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml" 

eval "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml" 
+1

Пожалуйста, добавьте ошибку, которую вы получите в следующий раз. –

+0

На самом деле, он отлично работает, когда вы запускаете его из оболочки UNIX ** **. Оболочка разбивает строку на слова. Если вам почему-то нужны службы оболочки для запуска 'java', используйте, например, 'exec sh -c" java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml "', в противном случае см. ответ Йоханнеса. – potrzebie

ответ

5

Используйте отдельные аргументы.

exec java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml 

Я не уверен, если exec смотрит на пути, так что лучше делать делать следующее:

exec {*}[auto_execok java] diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml 

Или, если вы находитесь на 8.4 (который является концом жизни, кстати)

eval [linsert {exec diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml} 1 [auto_execok java]] 
+1

FYI, 'exec', безусловно, _does_ использовать путь. –

1

Есть три способа сделать это:

exec java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml 

Нет котировок; каждое слово Tcl становится отдельным аргументом.

set command "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml" 
exec {*}$command 
# or in 8.4 and before, one of these: 
# eval exec $command 
# eval [list exec] [lrange $command 0 end] 
# eval [linsert $command 0 exec] 

Или, если вы предпочитаете синтаксис оболочки для Tcl синтаксиса:

set command "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml" 
exec /bin/sh -c $command 

Этот последний один очень полезно, когда вам нужно сделать сложные переназначения; в настоящее время их легче сделать в оболочке Bourne (и ее производных), чем в Tcl. Это (возможно) не будет работать на Windows, хотя; с другой стороны, эквивалент выстрелил через CMD.EXE.

+0

Обычно, когда вы используете окна, используйте 'cmd.exe/c ...' или даже 'cmd.exe/c start {} ...' –