2013-12-03 2 views
0

Я хотел бы экспортировать переменную в зависимости от результата двоичной команды. Мой TCL скрипт это:Запуск внешней программы из сценария Tcl

set A "" 

exec sh -c "export A=\"`/usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery -noprompt | grep ^Device | wc -l`\"" 

puts $A 

if { $A == "1" } { 
    set CUDA_VISIBLES_DEVICES 0 
} else { 
    set CUDA_VISIBLES_DEVICES 1 
} 

С помощью этого скрипта, когда я исполняю puts $A я не получаю ничего в терминале ... так в if команды я не знаю, что я оценка ... My " экспорт "должен возвращаться ТОЛЬКО 1 или 0 ...

Извините за мой плохой уровень TCL.

Спасибо.

+0

Вы не можете изменить переменные среды родительского процесса из дочернего процесса. – keltar

+0

Но я создаю A и CUDA_VISIBLES_DEVICES в сценарии TCL как новые переменные среды ... Я думаю. –

+0

New - это только одна из форм изменения. Но, возможно, я не понимаю, что должен означать ваш «экспорт». Просьба уточнить. – keltar

ответ

2

Я предполагаю, что вы хотите что-то вроде этого:

set a [exec /usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery -noprompt | grep ^Device | wc -l] 

Вы можете установить переменную a в TCL контексте и присвоить возвращаемое значение данной команды (то есть выход текста) к нему.

+3

Страница руководства '' exec' (http://www.tcl.tk/man/tcl8.6/TclCmd/exec.htm) является обязательным для Даниэля. – kostix

0

Проблема заключается в том, что ваша команда exec'd запускается в своем собственном процессе, поэтому, когда вы устанавливаете переменную A, она существует только как переменная оболочки для жизни этого процесса. Когда процесс завершается, A уходит.

Команда exec возвращает команду stdout команды, которая была выполнена exec'd. Если вы хотите, чтобы результат выполнения команды, чтобы быть в переменной Tcl, вам нужно установить переменный быть результатом из запускаемых:

set A [exec ...] 

Для получения дополнительной информации о команде ехеса см exec man page.

Смежные вопросы