Положитесь на PATH или предоставьте явный путь при использовании system () - PullRequest
1 голос
/ 05 февраля 2010

Я пишу программу на C, которая выполняет несколько вызовов system () для выполнения других программ. При построении командной строки лучше явно указать полный путь к вызываемой программе или мне просто нужно дать имя исполняемого файла и позволить оболочке определить свое местоположение с помощью переменной среды PATH?

Все программы, которые я вызываю, являются частью одного пакета, и у меня есть путь к каталогу установки из определения препроцессора. Задание явного пути, по-видимому, позволит избежать ошибок, которые могут возникнуть, если несколько установленных программ имеют одно и то же имя. Однако это усложняет сборку командных строк, и все сломается, если пользователь переместит программы после установки.

Существует ли широко распространенная лучшая практика, касающаяся этого?

[Разъяснение]

Я использую autoconf / automake для генерации дистрибутива. Определение препроцессора, предоставляющее каталог установки, создается make-файлом. Он отражает выбранный пользователем каталог установки, как указано в строке configure comamnd или в командной строке make. Я действительно использую переменные окружения, чтобы указать расположение двоичных файлов. Это кажется ненужной болью в заднице, заставляющей пользователей перестраивать только для того, чтобы изменить местоположение двоичных файлов.

Ответы [ 5 ]

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

Рекомендуется никогда не предполагать, что вы знаете каталог установки во время сборки. Пусть ваши пользователи сами решат, где установить и работать.

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

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

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

Если вы абсолютно уверены в именах путей и если они не являются «общеизвестными» командами (например, утилиты оболочки POSIX в Unix «общеизвестны»), вы должны указать путь, иначе не указывайте полный путь или не позволяйте пользователю управлять им с помощью переменной среды.

Фактически, вы можете написать что-то вроде функции, такой как int my_system(const char *);, которая выполняет префикс пути за вас. Если позже вы решите, что это плохая идея, то просто сделайте my_system() идентичным system().

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

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

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

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

Лучше всего не предполагать ничего о системе, на которую вы устанавливаете. Вы можете получить лучшее из обоих миров, если вы просто позволите пользователю выбирать. Введите команду, которую вы называете настройкой приложения, или задайте пути, которые должны быть определены в среде:

PATH_TO_TOOL1=foo
PATH_TO_TOOL2=/usr/bin/bar

Конечно, вы можете просто вернуться к некоторому виду по умолчанию, если переменные не определены или предпочтения не установлены. Писать ваше приложение, чтобы оно было более гибким, всегда лучший выбор!

0 голосов
/ 05 февраля 2010

Я не уверен, что это лучший метод, но в этих случаях я пишу код C на , расширяя переменную окружения PATH, добавляя каталог установки в конце .Тогда я просто использую PATH.Таким образом, если пользователь PATH хочет переопределить то, где я считаю, что материал был установлен, он может, но если программное обеспечение было установлено в недоступном месте, я могу вызвать его, не заставляя своих пользователейкаталог на $PATH самих.

Обратите внимание, что расширенный PATH действует только до тех пор, пока работает программа C;Я не предлагаю менять постоянные PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...