Linux как узнать путь к программе

В среде Windows есть API для получения пути, по которому выполняется процесс. Есть ли что-то подобное в Unix / Linux?

Или есть другой способ сделать это в этих условиях?

lsalamon 3 Мар 2009 в 14:35

11 ответов

Лучший ответ

В Linux символическая ссылка /proc//exe содержит путь к исполняемому файлу. Используйте команду readlink -f /proc//exe , чтобы получить значение.

В AIX этот файл не существует. Вы можете сравнить cksum и cksum /proc//object/a.out .

Nathan 6 Мар 2017 в 22:39
sudo если вывод пустой, некоторые процессы созданы другими пользователями системы.
2 Сен 2017 в 08:21

Вы можете легко найти исполняемый файл этими способами, просто попробуйте сами.

hahakubile 1 Июл 2014 в 12:19

Это круто. Я знал, что запустил его из места, где была символическая ссылка на исходный исполняемый файл (одна из многих версий). pwdx дал мне расположение символической ссылки, чтобы я мог найти журналы и остановить процесс должным образом.

12 Апр 2018 в 03:58
ll обычно является псевдонимом: alias ll=’ls -alF’ .
Pablo Bianchi
21 Авг 2018 в 07:19

Обучение Linux. От новичка до профи. Часть 1

Последние два (pwdx и lsof) могут дать неверный результат. Вопрос касался полного пути к исполняемому файлу. pwdx и lsof предоставят вам cwd процесса, а не путь к процессу. Я думаю, что ответ jpalecek более точен, поскольку исходный запросчик запрашивал путь к исполняемому файлу, а не программную ссылку, описывающую исполняемый файл.

21 Ноя 2019 в 15:21

Это действительно полезно, однако для последнего, похоже, мне нужно использовать lsof -p | grep -m 1 txt , поскольку необходимая информация о пути процесса, похоже, находится в первой строке с txt , а не в cwd линия? (Применимо к macOS и Ubuntu на дату публикации.)

MikeBeaton
4 Июл 2021 в 10:31

Немного поздно, но все ответы были конкретно для Linux.

Если вам нужен еще и unix, то вам понадобится это:

char * getExecPath (char * path,size_t dest_len, char * argv0) < char * baseName = NULL; char * systemPath = NULL; char * candidateDir = NULL; /* the easiest case: we are in linux */ size_t buff_len; if (buff_len = readlink («/proc/self/exe», path, dest_len — 1) != -1) < path [buff_len] = ‘’; dirname (path); strcat (path, «/»); return path; >/* Ups. not in linux, no guarantee */ /* check if we have something like execve(«foobar», NULL, NULL) */ if (argv0 == NULL) < /* we surrender and give current path instead */ if (getcwd (path, dest_len) == NULL) return NULL; strcat (path, «/»); return path; >/* argv[0] */ /* if dest_len < PATH_MAX may cause buffer overflow */ if ((realpath (argv0, path)) (!access (path, F_OK))) < dirname (path); strcat (path, «/»); return path; >/* Current path */ baseName = basename (argv0); if (getcwd (path, dest_len — strlen (baseName) — 1) == NULL) return NULL; strcat (path, «/»); strcat (path, baseName); if (access (path, F_OK) == 0) < dirname (path); strcat (path, «/»); return path; >/* Try the PATH. */ systemPath = getenv («PATH»); if (systemPath != NULL) < dest_len—; systemPath = strdup (systemPath); for (candidateDir = strtok (systemPath, «:»); candidateDir != NULL; candidateDir = strtok (NULL, «:»)) < strncpy (path, candidateDir, dest_len); strncat (path, «/», dest_len); strncat (path, baseName, dest_len); if (access(path, F_OK) == 0) < free (systemPath); dirname (path); strcat (path, «/»); return path; >> free(systemPath); dest_len++; > /* again someone has use execve: we dont knowe the executable name; we surrender and give instead current path */ if (getcwd (path, dest_len — 1) == NULL) return NULL; strcat (path, «/»); return path; >

EDITED: исправлена ​​ошибка, о которой сообщил Марк Лаката.

Читайте также:
Программа Газпрома по инвестициям для населения отзывы

Основы Linux. Работа с файлами и каталогами

Hiperion 5 Сен 2018 в 16:59

Спасибо, что поделились Hiperion, но мне нужно было указать PID и получить его путь к exe, возможно ли это с помощью этого кода?

Источник: question-it.com

Как в Bash узнать абсолютный путь до файла

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

Пример абсолютного пути: /home/mial/bin/myfile.txt

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

Относительный путь указывает на расположение файла относительно текущей папки. Примеры относительных путей:

Преимущество относительного пути в том, что обычно он обозначается более короткой записью как например myfile.txt — означает одноимённый файл в текущей папке. Очевидно, что при смене рабочей директории относительный путь до файла станет другим.

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

realpath

Первый вариант — использовать команду realpath:

realpath timeout

Привет вывода абсолютного пути:

/home/mial/bin/timeout

Эта программа является частью coreutils.

По умолчанию эта программа преобразует символические ссылки (опция -P) и показывает расположение файла даже если он не существует (опция -m) — то есть эти опции указывать необязательно.

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

realpath not_exist /home/mial/bin/not_exist

Если вас это не устраивает, то используйте опцию -e — тогда если указанный файл не существует, то вместо вывода абсолютного пути будет показано сообщение об ошибке.

Аналогичную функцию выполняет и команда readlink.

Если вы хотите показать абсолютный путь только для существующих файлов, то используйте опцию -e:

readlink -e timeout /home/mial/bin/timeout

Если вас не волнует, существует ли файл, то используйте опцию -f (не требует существование последнего компонента) или опцию -m (не требует существование какого-либо компонента пути):

readlink -f not_exist /home/mial/bin/not_exist

UNIX системы — это не только многочисленные дистрибутивы Linux. В некоторых из них команды realpath и readlink могут отсутствовать. Если они отсутствуют и вы не хотите или не можете устанавливать дополнительные бинарные файлы, то выход всё равно есть.

Создайте файл, например, realpath.sh и скопируйте в него:

#! /bin/sh echo «$(cd «$(dirname «$1″)»; pwd -P)/$(basename «$1″)»
bash realpath.sh ФАЙЛ

Этот же вариант в виде функции:

function realpath < echo $(cd $(dirname $1); pwd)/$(basename $1); >

Вот эта же функция в продвинутом варианте — дополнительно обрабатывает ситуацию, когда директория не существует, а также если во вводе присутствуют ‘..’ или ‘.’

get_abs_filename() < # $1 : relative filename filename=$1 parentdir=$(dirname «$») if [ -d «$» ]; then echo «$(cd «$» pwd)» elif [ -d «$» ]; then echo «$(cd «$» pwd)/$(basename «$»)» fi >

Ещё один вариант в виде функции оболочки, который:

  • не требует утилит (только cd и pwd)
  • работает для директорий и файлов
  • обрабатывает .. и .
  • обрабатывает пробелы в директориях и именах файлов
  • требует, чтобы файл или директория существовали
  • ничего не возвращает, если ничего не существует
  • может принимать абсолютные пути в качестве ввода (хотя ничего с ними не делает)

function abspath() < # генерирует абсолютный путь из относительного # $1 : относительное имя файла # возвращает : абсолютный путь if [ -d «$1» ]; then # dir (cd «$1»; pwd) elif [ -f «$1» ]; then # file if [[ $1 = /* ]]; then echo «$1» elif [[ $1 == */* ]]; then echo «$(cd «$»; pwd)/$» else echo «$(pwd)/$1» fi fi >

И ещё одна функция, записанная в одну строку и работающая в bash и zsh (другие не проверялись):

abspath () < case «$1» in /*)printf «%sn» «$1»;; *)printf «%sn» «$PWD/$1»;; esac; >

Может работать с несуществующими файлами.

Связанные статьи:

  • Лучшие терминальные мультиплексные инструменты (50%)
  • Как просмотреть или отредактировать метаданные pdf или изображениях из командной строки Linux (50%)
  • Как установить 7zip на Linux (50%)
  • Работа с архивами в Linux (50%)
  • Какие есть полезные инструменты с интерфейсом командной строки для системных администраторов Linux (50%)
  • Ошибка «-bash: sudo: command not found» — не найдена команда sudo (РЕШЕНО) (RANDOM — 50%)
Читайте также:
Проектирование интерфейса программы это

Рекомендуемые статьи:

2 Комментарии

basarga 23.01.2021 в 10:50

Зачем использовать какие-то скрипты с pwd, readlink или realpath для ТЕКУЩЕЙ директории, если можно просто использовать pwd. pwd /home/bestoloch Или просто прочитай глобальную переменную $PWD: echo $PWD /home/bestoloch Вдумайся, что такое ТЕКУЩАЯ директория! Это просто значение в переменной $PWD! «cd /home» и PWD=’/home’ это ОДНО И ТОЖЕ! Просто абстракция, благодаря которой ты думаешь, что «переходишь» из директории в директорию. А теперь включи мозг, и сообрази, как узнать путь к запускаемому скрипту, если запускаешь его не из ТЕКУЩЕЙ директории, а из, примеру, соседней?

Alexey (Автор записи) 23.01.2021 в 11:25

Во-первых, вам надо что-то делать со своей манерой общения: даже если вы считаете себя самым умным и считаете что много знаете, разговаривать в таком тоне с вами никто не обязан. А вы далеко не самый умный — показанные способы подходят на все случаи жизни, в том числе, когда получаем путь для файла, который является ссылкой. С помощью pwd или переменной это не сработает.

И самое главное, pwd не поможет, если нужно получить абсолютный путь не просто для файла в текущей папке, а для относительного пути (например, ../../bin/myfile.txt), а методы в статье предназначены именно для таких ситуаций, чтобы любые относительные пути преобразовывать в абсолютные. Следующее отличие — если мы просто будем добавлять к имени файла вывод команды pwd, то мы никогда не узнаем, существует ли этот файл на самом деле или нет.

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

Источник: zalinux.ru

Переменные окружения в Linux

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

Зачем нужны переменные окружения?

Если коротко, то они необходимы для организации различного рода окружений: системных, пользовательских, сеансовых, т. е. для хранения настроек соответствующих сред внутри системы. К примеру, программы для своей работы используют библиотечные функции, являющиеся одним из важнейших системных ресурсов. Или, например, интерпретатор команд способен находить соответствующие командам исполняемые файлы без необходимости каждый раз указывать соответствующие пути.

Но как программы «узнают», где можно найти те или иные ресурсы? Из переменных окружения. Таким же образом происходит запуск и исполнение команд в командной консоли, т. к. благодаря переменной окружения PATH интерпретатор bash (или любая другая командная оболочка) находит программу (исполняемый файл или библиотеку) по указанному в PATH пути. И таким же образом, к примеру, команда man «знает», что запрашиваемые страницы справочных руководств нужно искать согласно значению переменной окружения MANPATH.

Получение информации о переменных окружения

В работе, тесно связанной с системным администрированием довольно часто приходится сталкиваться с такими ситуациями, когда необходимо узнать значения некоторых переменных окружения или же вывести список полный список таковых. Для этой цели существует несколько специализированных утилит. В подавляющем большинстве случаев соответствующие пакеты уже предустановлены в системе. Самыми распространёнными из таких утилит являются printenv, env, а также export. Так, например, для того, чтобы вывести список действующих переменных окружения нужно дать следующую команду:

$ printenv GS_LIB=/home/john/.fonts KDE_FULL_SESSION=true LANG=ru_RU.UTF-8 DISPLAY=:0 OLDPWD=/home/john/builds/wxwidgets PWD=/home/john HOME=/home/john . . . SHELL=/bin/bash PATH=/opt/wxwidgets/bin:/home/john/.config/composer/vendor/bin:/usr/bin

В данном выводе представлен сильно сокращённый список переменных окружения для Kubuntu 18.04. Также следует заметить, что представленный список относится к пользовательскому набору, доступному текущему пользователю. Если выполнить команду printenv от имени суперпользователя (root), то набор переменных будет несколько отличаться.

Читайте также:
Avast free как добавить программу в исключения

Как следует из вышеприведённого вывода, для пользователя john используется русская локализация для сеанса (LANG), в качестве командного интерпретатора по-умолчанию используется bash (SHELL), текущим активным каталогом является /home/john (PWD), а переменная PATH модифицирована и содержит в себе (кроме дефолтного /usr/bin) значения /opt/wxwidgets/bin и /home/john/.config/composer/vendor/bin. Значение каждой переменной окружения представляет собой, как можно видеть, набор параметров, разделённых двоеточиями.

Тот же список можно вывести, если дать команду env. Также можно использовать команду export с ключом -p:

$ export -p

Для вывода значения конкретной переменной:

$ echo $PATH
$ printenv | grep PATH

В последнем случае будет выведены все переменные, содержащие фразу «PATH».

Виды переменных окружения

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

Ниже приведены некоторые наиболее часто используемые переменные окружения:

Системные переменные

Согласно стандартам Linux переменные окружения для организации системной среды хранятся в нескольких файлах:

  • /etc/bash.bashrc – хранение переменных для командных оболочек;
  • /etc/profile – хранение переменных для интерактивных оболочек;
  • /etc/environment – переменные из этого файла используются модулем

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

Пользовательские переменные

Для систем, ориентированных на многопользовательский доступ, например на хостинговых площадках, конкретному пользователю полезно иметь возможность гибко настраивать своё собственное рабочее окружение, создавая новые переменные или дополняя их новыми значениями. К примеру, владельцу сайта, для его виртуального хоста, обслуживающего сайт на CMS Drupal, захотелось установить утилиту drush, которая облегчает и ускоряет обслуживание CMS. В этом случае достаточно после локальной установки (в каком-нибудь подкаталоге домашнего каталога) drush, дополнить переменную PATH значением, содержащим путь к утилите drush в файле ~/.bashrc. В результате командная оболочка сможет запускать команду drush для данного пользователя.

По стандартам соглашений для Linux-систем конфигурация для пользовательского окружения должна храниться в следующих файлах:

  • ~/.bashrc – для хранения параметров инициализации выбранной командной оболочки для пользователя;
  • ~/.profile – для инициализации доступных пользователю командных оболочек;
  • ~/.pam_environment – для использования модулем

Временные или переменные сеанса

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

$ source файл_скрипта

Или же устанавливать их вручную командой export.

Установка переменных окружения

Чтобы установить временную (для сеанса) переменную окружения достаточно выполнить команду со следующим синтаксисом:

ИМЯ=’значение’
$ SOMEVAR=’somevalue’ $ echo $SOMEVAR somevalue

Если нужно временно модифицировать переменную PATH, то можно выполнить export:

$ export PATH=»$:/home/john/tmp/usr/bin»

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

$ unset SOMEVAR

Для установки системных или пользовательских переменных окружения следует помещать код с нужными переменными в соответствующие файлы инициализации окружения. Например, чтобы добавить на системном уровне какой-либо пользовательский каталог (пусть это будет ~/bin), нужно один из файлов (/etc/profile или /etc/bash.bashrc) дополнить следующим кодом:

export PATH=”$HOME/bin:$PATH”

В случае, если нужно выполнить то же самое для пользовательского уровня переменных окружения, то редактировать нужно файл (для локального входа) ~/.bashrc (для удалённого входа, например по SSH – ~/.bash_profile):

export PATH=”$HOME/.config/composer/vendor/bin:$PATH”

Этот код включит использование командным интерпретатором вышеупомянутой команды drush (предварительно установленной по указанному пути, конечно) для CMS Drupal.

Чтобы можно было видеть сделанные изменения, нужно их зафиксировать:

$ source ~/.bashrc

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник: itproffi.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru