C++ получить полный путь бинаря
Подскажите как получить полный путь до исполняемого файла.
Что-то типа getcwd() только для полного пути к исполняемому файлу.
argv[0] не подходит. не из мейна вызывать.
Для полноты картины: QCoreApplication::applicationFilePath ().
>argv[0] не подходит. не из мейна вызывать.
А правильную директорию кто устанавливать будет?
> argv[0] не подходит. не из мейна вызывать.
Что мешает вам сделать значение argv[0] доступным не из мейна?
> Что мешает вам сделать значение argv[0] доступным не из мейна?
argv[0] не обязательно полный каноничный путь к исполняемому файлу, если пытаться привести его к абсолютному не из main() — можно получить уже левый путь, пока readlink + /proc это единственный вменяемый способ, он же используется и внутрях того же Qt
> argv[0] не обязательно полный каноничный путь к исполняемому файлу, если пытаться привести его к абсолютному не из main()
Это все понятно, тем не менее проанализировав argv[0], текущую директорию и переменную окружения PATH, тоже можно получить путь к исполняемому файлу. Именно такой способ и используется внутрях того же Qt, если пофейлился способ readlink + /proc.
Именно такой способ и используется внутрях того же Qt, если пофейлился способ readlink + /proc.
Это для BSD, что ли?
> Это для BSD, что ли?
Анализ argv[0] используется для любой системы на которой определен макрос Q_OS_UNIX, за исключением linux’a.
В linux вначале делается попытка получить имя через /proc/pid/exe, если имя получить не удалось, то делается анализ argv[0]. Первый способ может пофейлиться, например, из-за удаления/переименования/перемещения исполняемого файла.
В винде я так понимаю это какие-то винапи ?
Я просто не пойму, как может провалиться способ чтения симлинка на /proc/self/exe в линуксе?
> Я просто не пойму, как может провалиться способ чтения симлинка на /proc/self/exe в линуксе?
Вы до конца пост дочитать не пробовали?
может пофейлиться, например, из-за удаления/переименования/перемещения исполняемого файла.
> В винде я так понимаю это какие-то винапи ?
Источник
Переменная PATH в Linux
Когда вы запускаете программу из терминала или скрипта, то обычно пишете только имя файла программы. Однако, ОС Linux спроектирована так, что исполняемые и связанные с ними файлы программ распределяются по различным специализированным каталогам. Например, библиотеки устанавливаются в /lib или /usr/lib, конфигурационные файлы в /etc, а исполняемые файлы в /sbin/, /usr/bin или /bin.
Таких местоположений несколько. Откуда операционная система знает где искать требуемую программу или её компонент? Всё просто — для этого используется переменная PATH. Эта переменная позволяет существенно сократить длину набираемых команд в терминале или в скрипте, освобождая от необходимости каждый раз указывать полные пути к требуемым файлам. В этой статье мы разберёмся зачем нужна переменная PATH Linux, а также как добавить к её значению имена своих пользовательских каталогов.
Переменная PATH в Linux
Для того, чтобы посмотреть содержимое переменной PATH в Linux, выполните в терминале команду:
На экране появится перечень папок, разделённых двоеточием. Алгоритм поиска пути к требуемой программе при её запуске довольно прост. Сначала ОС ищет исполняемый файл с заданным именем в текущей папке. Если находит, запускает на выполнение, если нет, проверяет каталоги, перечисленные в переменной PATH, в установленном там порядке. Таким образом, добавив свои папки к содержимому этой переменной, вы добавляете новые места размещения исполняемых и связанных с ними файлов.
Для того, чтобы добавить новый путь к переменной PATH, можно воспользоваться командой export. Например, давайте добавим к значению переменной PATH папку/opt/local/bin. Для того, чтобы не перезаписать имеющееся значение переменной PATH новым, нужно именно добавить (дописать) это новое значение к уже имеющемуся, не забыв о разделителе-двоеточии:
Теперь мы можем убедиться, что в переменной PATH содержится также и имя этой, добавленной нами, папки:
Вы уже знаете как в Linux добавить имя требуемой папки в переменную PATH, но есть одна проблема — после перезагрузки компьютера или открытия нового сеанса терминала все изменения пропадут, ваша переменная PATH будет иметь то же значение, что и раньше. Для того, чтобы этого не произошло, нужно закрепить новое текущее значение переменной PATH в конфигурационном системном файле.
В ОС Ubuntu значение переменной PATH содержится в файле /etc/environment, в некоторых других дистрибутивах её также можно найти и в файле /etc/profile. Вы можете открыть файл /etc/environment и вручную дописать туда нужное значение:
sudo vi /etc/environment
Можно поступить и иначе. Содержимое файла .bashrc выполняется при каждом запуске оболочки Bash. Если добавить в конец файла команду export, то для каждой загружаемой оболочки будет автоматически выполняться добавление имени требуемой папки в переменную PATH, но только для текущего пользователя:
Выводы
В этой статье мы рассмотрели вопрос о том, зачем нужна переменная окружения PATH в Linux и как добавлять к её значению новые пути поиска исполняемых и связанных с ними файлов. Как видите, всё делается достаточно просто. Таким образом вы можете добавить столько папок для поиска и хранения исполняемых файлов, сколько вам требуется.
Источник
Как получить путь к процессу в Unix / Linux
в среде Windows существует API для получения пути, по которому выполняется процесс. Есть ли что-то подобное в Unix / Linux?
или есть какой другой способ сделать это в подобных условиях?
10 ответов
в Linux, символьная ссылка /proc/
/exe имеет путь к исполняемому файлу. Используйте команду readlink -f /proc/
/exe чтобы получить значение.
в AIX, этот файл не существует. Вы могли бы сравнить cksum и cksum /proc/
вы можете легко найти exe этими способами, просто попробуйте сами.
немного поздно, но все ответы были специфичны для Linux.
Если Вам также нужен unix, то вам нужно это:
редактировать: Исправлена ошибка, о которой сообщил Марк лаката.
замените 786 своим PID или именем процесса.
в Linux каждый процесс имеет свою собственную папку в /proc . Так что вы могли бы использовать getpid() чтобы получить pid запущенного процесса, а затем присоединиться к нему с помощью path /proc чтобы получить папку, которую вы, надеюсь, нужна.
вот краткий пример в Python:
вот пример в ANSI C, а также:
скомпилируйте его с помощью:
эта команда будет извлекать путь процесса из того места, где он выполняется.
нет метода «гарантированно работать в любом месте».
Шаг 1-проверить argv[0], если программа была запущена по полному пути, это (обычно) будет иметь полный путь. Если он был запущен относительным путем, то же самое выполняется (хотя для этого требуется получить текущий рабочий каталог, используя getcwd().
Шаг 2, Если ни один из вышеперечисленных не выполняется, должен получить имя программы, а затем получить имя программы из argv[0], а затем получить путь пользователя из окружающая среда и пройти через это, чтобы увидеть, если есть любой исполняемый файл с тем же именем.
обратите внимание, что argv[0] устанавливается процессом, который выполняет программу, поэтому он не является 100% надежным.
спасибо : Kiwy
с AIX:
вы также можете получить путь на GNU / Linux с (не полностью протестирован):
Если вы хотите, чтобы каталог исполняемого файла, возможно, изменил рабочий каталог на каталог процесса (для media/data /etc), вам нужно удалить все после последнего/:
Источник
Путь к файлу в Linux
Все файлы в Linux имеют определенный адрес в файловой системе, с помощью которого мы можем получить к ним доступ с помощью файлового менеджера или консольных утилит. Это довольно простая тема, но у многих новичков с этим возникают трудности.
В сегодняшней небольшой заметке мы рассмотрим что такое путь к файлу Linux, каким он может быть, как правильно его писать и многое другое. Если раньше у вас возникали с этим трудности, то после прочтения статьи все станет полностью понятно.
Пути файлов в Linux
Файловая система Linux очень сильно отличается от Windows. Мы не будем рассматривать ее структуру, это было сделано ранее. Мы сосредоточимся на работе с файлами.
Самое главное отличие, в том что адрес файла начинается не с диска, например, C:\ или D:\ как это происходит в Windows, а с корня, корневого системного каталога, к которому подключены все другие. Его адрес — /. И тут нужно сказать про адреса. Пути файлов linux используют прямой слеш «/» для разделения каталогов в адресе, и это отличается от того, что вы привыкли видеть в Windows — \.
Например, если в Windows полный путь к файлу на рабочем столе выглядел C:\Users\Sergiy\Desktop\ то в путь файла в linux будет просто /home/sergiy/desktop/. С этим пока все просто и понятно. Но проблемы возникают дальше.
В операционной системе Linux может быть несколько видов путей к файлу. Давайте рассмотрим какие бывают пути в linux:
- Полный, абсолютный путь linux от корня файловой системы — этот путь вы уже видели в примере выше, он начинается от корня «/» и описывает весь путь к файлу;
- Относительный путь linux — это путь к файлу относительно текущей папки, такие пути часто вызывают путаницу.
- Путь относительно домашний папки текущего пользователя. — путь в файловой системе, только не от корня, а от папки текущего пользователя.
Рассмотрим теперь подробнее как выглядят эти пути в linux, а также разберем несколько примеров, чтобы было окончательно понятно. Для демонстрации будем пользоваться утилитой ls, которая предназначена для просмотра содержимого каталогов.
Например, у нас есть такой каталог в домашней папке с четырьмя файлами в нем:
Вот так будет выглядеть полный путь linux к одному из файлов:
Это уже относительный путь linux, который начинается от домашней папки, она обозначается
/. Дальше вы уже можете указывать подпапки, в нашем случае tmp:
Ну или путь файла в linux, относительно текущей папки:
В каждой папке есть две скрытые ссылки, мы сможем их увидеть с помощью ls, выполнив ее с параметром -a:
Первая ссылка указывает на текущую папку (.), вторая (..) указывает на папку уровнем выше. Это открывает еще более широкие возможности для навигации по каталогам. Например, чтобы сослаться на файл в текущей папке можно использовать конструкцию:
Это бесполезно при просмотре содержимого файла. Но очень важно при выполнении программы. Поскольку программа будет сначала искаться в среде PATH, а уже потом в этой папке. А потому, если нужно запустить программу, которая находится в текущей папке и она называется точно также как и та что в каталоге /bin, то без явной ссылки что файл нужно искать в текущей папке ничего не получится.
Вторая ссылка вам позволяет получить доступ к файлам в папке выше текущей. Например:
Такие конструкции могут довольно часто встречаться при компиляции программ. Все эти символы и пути файлов linux вы можете применять не только в терминале, но и в любом файловом менеджере, что может быть очень удобно.
Но терминал Linux предоставляет еще более широкие возможности. Вы можете использовать простые символы замены прямо в адресах файлов или каталогов. Например, можно вывести все файлы, начинающиеся на f:
Или даже можно искать не только в папке tmp, а в любой подпапке домашней папки:
И все это будет работать, возможно, это не всегда нужно и практично. Но в определенных ситуациях может очень сильно помочь. Эти функции реализуются на уровне оболочки Bash, поэтому вы можете применять их в любой команде. Оболочка смотрит сколько файлов было найдено и для каждого из них вызывает команду.
Выводы
Вот и все. Теперь вы знаете все что необходимо, чтобы не только правильно написать путь к файлу linux, но и выполнять более сложные действия, например, поиск файлов или навигация по каталогам с помощью команды cd. Если у вас остались вопросы, спрашивайте в комментариях!
Источник
Как получить полный путь к исполняемому файлу?
Пишу скрипт, он определяет какой архитектуры исполняемый файл и подставляет ему нужные библиотеки.
При помощи команды
Как найти указанный в параметре исполняемый файл к которому не указан полный путь по переменной окружения?
Перемещено leave из talks
Дык, никак. А кто искать то будет? Пушкин?
Если скрипты в строго определенных директориях, то пропиши эти пути в самом скрипте.
Дык, никак. А кто искать то будет? Пушкин?
bash же как то ищет.
так он и ищет по путям в PATH
Если скрипты в строго определенных директориях, то пропиши эти пути в самом скрипте.
Программу предполагается использовать примерно так:
есть ли готовый парсер на bash для разбора этой переменной и поиска?
А как же революция?
Я о том, что если «программы» могут лежать только в заранее заданной директории, то ты внутри скрипта можещь написать типа blabla /mydetermineddir/$1 [another params]
зачем тебе это вообще могло понадобиться?
Тебе же первый ответивший дал правильный ответ.
Смотри:
readelf -h $(which wine) | grep ELF32
Класс: ELF32
есть ли готовый парсер на bash для разбора этой переменной и поиска?
ааааааааааааааа, кто там рядом живёт, стукните его по голове чем-нибудь тяжёлым. 1111
он же пишет, что ему нужен поиск вне PATH, which ничего не найдет
Мне всего 160км.
Как же вы задолбали!
pet / # mkdir /1
pet / # cp $(which wine) /1
pet / # ls /1
wine
pet / # echo $
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/6.2.0:/root/.local/bin:/root/bin
pet / # readelf -h $(env PATH=«$
Класс: ELF32
which он как яндекс — найдёт всё, что нужно, главное правильно спросить
Ты в Архызе сейчас?
че то тыы какую то пургу намел. Если добавить директорию в PATH, есен х, все отыщется. Че сказать то хотел? Зачем ты там с каким то копированием че-то делал?
Надо было с mv, ты прав
pet / # mv /usr/bin/wine /usr/bin/wine_
pet / # env PATH=«$
/1/wine
Какая разница, какое это отношение к вопросу имеет?
Вот именно это сказать и хотел:
Если добавить директорию в PATH, есен х, все отыщется.
Зачем ты там с каким то копированием че-то делал?
Каталог надо было вперёд ставить.
pet / # mv /usr/bin/wine_ /usr/bin/wine
pet / # ls /usr/bin/wine
/usr/bin/wine
pet / # env PATH=«/1:$
/1/wine
Какая разница, какое это отношение к вопросу имеет?
Не, непонято, если исходить из вопроса ТС, как найти скрипт, которого нет в PATH. Ладно, забей, мне, видимо, не понять.
Скрипт, которого нет в $
Если при запуске задавать полное имя скрипта, то каталог в котором этот скрипт лежит считай известен и его можно добавить в переменную PATH
Что ещё тебе не понятно? Не стесняйся, спрашивай.
pet / # cat /1/bzzz.sh
#! /bin/bash
pwd
echo $(dirname $0)
pet / # env PATH=/1 /bin/bash bzzz.sh
/
/1/bzzz.sh: line 4: dirname: команда не найдена
pet / # env PATH=/1:$
/
.
pet / # bzzz.sh
bash: bzzz.sh: команда не найдена
я об этом и сказал
Да, я знаю.
Мне непонятно, что тебе не нравится в запуске which с новой переменной PATH для поиска?
Просто, как бы, не совсем соответствует вопросу. Может я вопрос неверно понял, хз. Ладно, проехали.
В чем, собственно, проблема? %)
Но ведь пользователь введёт не полный путь к исполняемому файлу, а как чаще всего бывает просто его имя.
В этом случае исполняемый файл лежит в каталоге, содержащемся в PATH. Иначе надо вводить полный путь абсолютный, или относительный (что легко через dirname привести к первой задаче).
Как бы других-то способов нет и усложнять ничего не надо.
Абсолютно согласен, всё что можно было уже сказать по теме, в этой теме сказал самый первый комментатор 😀
PS: тему твою удалили про разум. ИМХО нет, чёткого критерия не будет.
Источник