Linux как узнать путь к программе
Перейти к содержимому

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

  • автор:

Как узнать путь до исполняемого файла в Linux?

suffix_ixbt

В линукс обычно исполняемые файлы лежат в /bin, /sbin, /usr/bin, /usr/sbin.
Иногда в /usr/local/bin, /usr/local/sbin.
Еще некоторый софт ставит себя в /opt и там в собственном подкаталоге создает похожую иерархию каталогов.
Найти программу по имени можно с помощью команды whereis
Или с помощью find / -name
find будет работать дольше т.к. будет сканировать все что сможет. whereis сканирует только каталоги указанные в PATH, поэтому работает гораздо быстрей.

Ответ написан более двух лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 1

DamianLewis

Damian Lewis @DamianLewis
Если только для ярлыков надо, можно посмотреть через системный монитор в разделе свойства процесса.
Скрин 1

60ec424239e39264282206.png

Также можно глянуть через htop в терминале.

Скрин 2

60ec426cb850d490467341.png

Скорее есть есть еще куча других вариантов, но я обходился только двумя этими

как найти в Ubuntu где лежит папка с программой?

Но как найти где папка chrome? Перепыл всю систему не пойму. В windows просто нажал правой кнопкой и свойства и там путь. Что я не так делаю?

Отслеживать
задан 21 янв 2016 в 10:39
10.9k 17 17 золотых знаков 62 62 серебряных знака 127 127 бронзовых знаков
что значит «скачал chrome»?
21 янв 2016 в 11:10

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вообще, запускаемый файл браузера Chrome называется google-chrome или google-chrome-stable . Найти полный путь к запускаемому файлу можно командой:

which which google-chrome-stable 

При условии, что файл находится в одной из папок, перечисленных в переменной окружения $PATH . Если это не так, найти его можно командой

find / -name

Но тогда и запустить его из консоли можно будет только как

/full/path/to/

Последняя команда найдет файл по имени, даже если он не запускаемый, если хватит прав.

Как получить полный путь к исполняемому файлу?

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

При помощи команды

readelf -h /usr/bin/programm_name | grep ELF32

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

Как найти указанный в параметре исполняемый файл к которому не указан полный путь по переменной окружения?

Перемещено leave из talks

rezedent12 ☆☆☆
23.09.16 21:15:51 MSK
1 2 →

which programm_name 

surefire ★★★
( 23.09.16 21:20:30 MSK )

Дык, никак. А кто искать то будет? Пушкин?

portquest2016
( 23.09.16 21:37:07 MSK )

Если скрипты в строго определенных директориях, то пропиши эти пути в самом скрипте.

portquest2016
( 23.09.16 21:38:13 MSK )
Ответ на: комментарий от portquest2016 23.09.16 21:37:07 MSK

Дык, никак. А кто искать то будет? Пушкин?

bash же как то ищет.

rezedent12 ☆☆☆
( 23.09.16 21:40:24 MSK ) автор топика
Ответ на: комментарий от rezedent12 23.09.16 21:40:24 MSK

так он и ищет по путям в PATH

portquest2016
( 23.09.16 21:41:11 MSK )
Ответ на: комментарий от portquest2016 23.09.16 21:38:13 MSK

Если скрипты в строго определенных директориях, то пропиши эти пути в самом скрипте.

Программу предполагается использовать примерно так:

скрипт программа [параметры передаваемые программе] 

rezedent12 ☆☆☆
( 23.09.16 21:42:20 MSK ) автор топика
Ответ на: комментарий от portquest2016 23.09.16 21:41:11 MSK

есть ли готовый парсер на bash для разбора этой переменной и поиска?

rezedent12 ☆☆☆
( 23.09.16 21:43:12 MSK ) автор топика

А как же революция?

dk-
( 23.09.16 21:43:43 MSK )
Ответ на: комментарий от rezedent12 23.09.16 21:42:20 MSK

Я о том, что если «программы» могут лежать только в заранее заданной директории, то ты внутри скрипта можещь написать типа blabla /mydetermineddir/$1 [another params]

portquest2016
( 23.09.16 21:45:35 MSK )

зачем тебе это вообще могло понадобиться?

Harald ★★★★★
( 23.09.16 21:45:46 MSK )
Ответ на: комментарий от rezedent12 23.09.16 21:40:24 MSK

Тебе же первый ответивший дал правильный ответ.
Смотри:
readelf -h $(which wine) | grep ELF32
Класс: ELF32

imul ★★★★★
( 23.09.16 21:46:20 MSK )
Ответ на: комментарий от rezedent12 23.09.16 21:43:12 MSK
portquest2016
( 23.09.16 21:46:33 MSK )
Ответ на: комментарий от rezedent12 23.09.16 21:43:12 MSK

есть ли готовый парсер на bash для разбора этой переменной и поиска?

ааааааааааааааа, кто там рядом живёт, стукните его по голове чем-нибудь тяжёлым. 1111

imul ★★★★★
( 23.09.16 21:47:51 MSK )
Ответ на: комментарий от imul 23.09.16 21:46:20 MSK

он же пишет, что ему нужен поиск вне PATH, which ничего не найдет

portquest2016
( 23.09.16 21:48:29 MSK )
Ответ на: комментарий от imul 23.09.16 21:47:51 MSK

Мне всего 160км.

dk-
( 23.09.16 21:49:58 MSK )
Ответ на: комментарий от portquest2016 23.09.16 21:48:29 MSK

Как же вы задолбали!
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=«$:/1» which wine) | grep ELF32
Класс: ELF32

which он как яндекс — найдёт всё, что нужно, главное правильно спросить

imul ★★★★★
( 23.09.16 21:52:27 MSK )
Ответ на: комментарий от dk- 23.09.16 21:49:58 MSK

Ты в Архызе сейчас?

imul ★★★★★
( 23.09.16 21:56:43 MSK )
Ответ на: комментарий от imul 23.09.16 21:52:27 MSK

че то тыы какую то пургу намел. Если добавить директорию в PATH, есен х, все отыщется. Че сказать то хотел? Зачем ты там с каким то копированием че-то делал?

portquest2016
( 23.09.16 21:58:43 MSK )
Ответ на: комментарий от portquest2016 23.09.16 21:58:43 MSK

Надо было с mv, ты прав
pet / # mv /usr/bin/wine /usr/bin/wine_
pet / # env PATH=«$:/1» which wine
/1/wine

imul ★★★★★
( 23.09.16 22:00:03 MSK )
Ответ на: комментарий от imul 23.09.16 22:00:03 MSK

Какая разница, какое это отношение к вопросу имеет?

portquest2016
( 23.09.16 22:01:20 MSK )
Ответ на: комментарий от portquest2016 23.09.16 21:58:43 MSK

Вот именно это сказать и хотел:

Если добавить директорию в PATH, есен х, все отыщется.
Зачем ты там с каким то копированием че-то делал?

Каталог надо было вперёд ставить.
pet / # mv /usr/bin/wine_ /usr/bin/wine
pet / # ls /usr/bin/wine
/usr/bin/wine
pet / # env PATH=«/1:$» which wine
/1/wine

imul ★★★★★
( 23.09.16 22:03:27 MSK )
Ответ на: комментарий от portquest2016 23.09.16 22:01:20 MSK

Какая разница, какое это отношение к вопросу имеет?

imul ★★★★★
( 23.09.16 22:04:19 MSK )
Ответ на: комментарий от imul 23.09.16 22:03:27 MSK

Не, непонято, если исходить из вопроса ТС, как найти скрипт, которого нет в PATH. Ладно, забей, мне, видимо, не понять.

portquest2016
( 23.09.16 22:05:38 MSK )
Ответ на: комментарий от imul 23.09.16 21:56:43 MSK

dk-
( 23.09.16 22:05:53 MSK )
Ответ на: комментарий от portquest2016 23.09.16 22:05:38 MSK

Скрипт, которого нет в $ при его старте только по одному имени выполняться один фиг не будет.
Если при запуске задавать полное имя скрипта, то каталог в котором этот скрипт лежит считай известен и его можно добавить в переменную 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:$ bash bzzz.sh
/
.

pet / # bzzz.sh
bash: bzzz.sh: команда не найдена

imul ★★★★★
( 23.09.16 22:13:41 MSK )
Ответ на: комментарий от imul 23.09.16 22:13:41 MSK

я об этом и сказал

portquest2016
( 23.09.16 22:15:01 MSK )
Ответ на: комментарий от portquest2016 23.09.16 22:15:01 MSK

Да, я знаю.
Мне непонятно, что тебе не нравится в запуске which с новой переменной PATH для поиска?

imul ★★★★★
( 23.09.16 22:17:15 MSK )
Ответ на: комментарий от imul 23.09.16 22:17:15 MSK

Просто, как бы, не совсем соответствует вопросу. Может я вопрос неверно понял, хз. Ладно, проехали.

portquest2016
( 23.09.16 22:35:01 MSK )

readelf -h `which bash`|grep ELF32 Class: ELF32 

В чем, собственно, проблема? %)

Nervous ★★★★★
( 23.09.16 22:45:34 MSK )
Ответ на: комментарий от portquest2016 23.09.16 22:35:01 MSK

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

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

Абсолютно согласен, всё что можно было уже сказать по теме, в этой теме сказал самый первый комментатор 😀

PS: тему твою удалили про разум. ИМХО нет, чёткого критерия не будет.

imul ★★★★★
( 23.09.16 22:48:23 MSK )
Последнее исправление: imul 23.09.16 22:51:03 MSK (всего исправлений: 1)

Как в 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

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

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

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

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

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

realpath и readlink не найдены

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 "%s\n" "$1";; *)printf "%s\n" "$PWD/$1";; esac; >

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

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

  • Лучшие терминальные мультиплексные инструменты (50%)
  • Как просмотреть или отредактировать метаданные pdf или изображениях из командной строки Linux (50%)
  • Как установить 7zip на Linux (50%)
  • Работа с архивами в Linux (50%)
  • Какие есть полезные инструменты с интерфейсом командной строки для системных администраторов Linux (50%)
  • Как посчитать количество экземпляров определённого процесса (в том числе с аргументами) (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, то мы никогда не узнаем, существует ли этот файл на самом деле или нет. В статье рассмотрены оба варианта: когда в случае отсутствия файла будет или не будет возвращена ошибка. Ну и так далее. Ваш комментарий нелеп. Видимо, вы даже не понимаете, о чём говорится в статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *