2014-10-09 1 views
2

Я пытаюсь выполнить следующую команду от Julia:Юлий: знак доллара в команде без одинарных кавычек

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user/.julia/v0.3/Smile/deps/downloads 

Когда я запускаю его как-он пытается заменить $ LD_LIBRARY_PATH с локальным переменным. Когда я ухожу из $, он помещает кавычки вокруг команды, что делает ее недействительной.

julia> cmd = `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/tim/.julia/v0.3/Smile/deps/downloads` 
ERROR: LD_LIBRARY_PATH not defined 

julia> cmd = `export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/home/tim/.julia/v0.3/Smile/deps/downloads` 
`export 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/tim/.julia/v0.3/Smile/deps/downloads'` 

Я хотел бы выполнить команду в форме, аналогичной форме:

run(`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$newpath`) 

Как правильно обрабатывать знак доллара?

Спасибо

* Примечание: вставить команду непосредственно в терминал и работает он работает

+0

бежать. '... = \ $ LD ...'. не знаю о julia, но поскольку вы выполняете внешнюю оболочку для выполнения вызова экспорта, оболочка собирается в PARSE/EXPAND эту переменную. избежание этого предотвращает это. –

+0

нет, я попытался убежать. Я сделаю это более ясным в вопросе – Mageek

+1

В соответствующей заметке можно сделать это: 'global const LIB_SMILE = find_library ([" libsmilejl "], [pathtoadd]) вместо того, чтобы возиться с LD_LIBRARY_PATH. – Mageek

ответ

1

В Джулии, обратные кавычки не полностью эквивалентны запуск соответствующей команды в оболочке. Вы не можете интерполировать переменные среды с $ (хотя $(get(ENV, "varname", "") должен соответствовать поведению оболочки), а export - это встроенная оболочка, а не команда, поэтому я не думаю, что вы можете ее запустить. Кроме того, даже если обратные выходы обрезаны, export изменит только среду подоболочки, а не вызывающий процесс.

Вы должны быть в состоянии установить LD_LIBRARY_PATH от Julia как:

ENV["LD_LIBRARY_PATH"] = "$(get(ENV, "LD_LIBRARY_PATH", "")):$newpath" 

но вы должны избежать этого, если это возможно. Если ваше намерение состоит в ccall конкретной библиотеке, вы можете пройти путь библиотеки непосредственно до ccall, возможно, используя find_library, как вы указали в комментарии, если вы не знаете полного пути. Если вам нужно установить LD_LIBRARY_PATH, потому что библиотеке необходимо загрузить другие библиотеки, я не уверен, есть ли лучший способ, но обратите внимание, что LD_LIBRARY_PATH является специфичным для платформы. Возможно, у вас могут быть dlopen зависимые библиотеки, но я их не тестировал.