Абсолютный путь к исполняемой программе

argv[0] ссылается на команду оболочки, которая вызвала загрузку текущего процесса. getcwd() возвращает текущий рабочий каталог. Из этой информации я могу построить абсолютный путь к исполняемому файлу программы? Я не ожидаю, что это сработает, если программа выполнила cd с момента первой загрузки.

2 Solutions collect form web for “Абсолютный путь к исполняемой программе”

В Linux вы можете использовать symlink /proc/self/exe

 $ ls -l /proc/self/exe lrwxrwxrwx 1 rudi users 0 2016-10-18 16:20 /proc/self/exe -> /usr/bin/ls 

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

 #if __linux__ static val get_self_path(void) { char self[PATH_MAX] = { 0 }; int nchar = readlink("/proc/self/exe", self, sizeof self); if (nchar < 0 || nchar >= convert(int, sizeof self)) return nil; return string_utf8(self); } #elif HAVE_WINDOWS_H static val get_self_path(void) { wchar_t self[MAX_PATH] = { 0 }; DWORD nchar; SetLastError(0); nchar = GetModuleFileNameW(NULL, self, MAX_PATH); if (nchar == 0 || (nchar == MAX_PATH && ((GetLastError() == ERROR_INSUFFICIENT_BUFFER) || (self[MAX_PATH - 1] != 0)))) return nil; return string(self); } #else static val get_self_path(void) { char self[PATH_MAX]; if (!progname_u8) return nil; if (realpath(progname_u8, self)) return string_utf8(self); return nil; } #endif 

Тип val , символ nil и string функций и string_utf8 являются внутренними для интерпретатора. convert – это просто макрос, который абстрагирует кастинг. Конечно, некоторые файлы заголовков требуются для readlink , realpath и так далее.

progname_u8 – это просто глобальная переменная, инициализированная непосредственно из argv[0] . в Unix, который не является Linux, мы используем его и называем realpath на нем, чтобы получить абсолютный путь.

  • * в конце пути к каталогу
  • Interesting Posts

    Как вы перечисляете все функции и псевдонимы в определенном скрипте?

    Обновлен до Ubuntu 14.04 – Почтовый сервер отсутствует dovecot-lmtp, даже если он установлен

    Изменение поиска YUM / DNF на изображении Raspberry Pi?

    Как я могу получить bash, чтобы выйти с ошибкой backtick, аналогично отказу?

    Извлеките все имена изображений с именами подпапок в CSV-файл, используя сценарий оболочки

    Есть ли способ выйти из «меньше» без очистки экрана?

    Загружать / синхронизировать файлы только в одном направлении

    Изменение настроек темы и кнопок мыши KDE из сценария оболочки

    Переменная Shell $ _ не ведет себя так, как ожидалось

    Изменение порядка стиля шрифта

    Отменить код выхода без использования функций оболочки

    Как установить конкретный каталог?

    Можно ли поставить арифметические выражения в кронтаб?

    Скрыть gitignored файлы дерева

    Предпочтительные подходы к удаленной регистрации сценария / демона?

    Linux и Unix - лучшая ОС в мире.