Когда я набираю имя некоторого исполняемого файла в командной строке, и он запускается, как я могу определить путь, где расположен этот исполняемый файл?
Если вы передаете опцию -a, отображаются все возможные совпадения. И есть также, whereisкто ищет руководства и источники, тоже.
Scai
3
Проблема простого решения
whichcommandнаходит исполняемый файл данного commandв вашем $PATH. К сожалению, это не будет работать, как ожидалось, во всех случаях.
Когда commandэто псевдоним или функция, вы не получите правильный результат, потому что сам исполняемый исполняемый файл может иметь совершенно другое имя. Например, во многих дистрибутивах Linux llпсевдоним установлен по умолчанию. which llничего не находит. Еще один проблемный случай, когда ваша оболочка ведет себя нестандартным образом и не запускает первый commandнайденный в $PATH.
Более надежное решение
В Linux, если вы хотите быть полностью уверены в пути к исполняемому файлу запущенного процесса, вы можете получить его из его PID (ID процесса; в приведенном ниже примере вместо числа введите $PID:)
readlink /proc/$PID/exe
Как получить номер? PID последнего запуска процесса в оболочке в фоновом режиме $!. Небольшая демонстрация:
sleep 20&
readlink /proc/$!/exe
Вы можете получить PID других процессов, например, из списка процессов, используя ps -ef.
Объяснение: /proc/$PID/exeэто символическая ссылка на исполняемый файл запущенного процесса. Команда readlinkпоказывает цель, на которую указывает символическая ссылка.
Скрипты - это особый случай
К сожалению, readlink /proc/$PID/exeметод не работает должным образом с языками сценариев, такими как bash, Perl, Python и т. Д. В таких случаях вы получите путь к интерпретатору сценария (например /bin/bash) вместо пути к сценарию. Чтобы приблизиться к информации, вы можете использовать:
cat /proc/$PID/cmdline # the commandline with the interpreter and script
readlink /proc/$PID/cwd # the current working directory
К сожалению, текущий рабочий каталог может измениться с момента запуска программы. Некоторые интерпретаторы, такие как bash, могут сохранять файл сценария открытым в дескрипторе 255:
readlink /proc/$PID/fd/255
Все может измениться
Может вызвать любой процесс, exec()который заменяет его /proc/$PID/exe, /proc/$PID/cmdlineи другую информацию.
Ответы:
Вы можете узнать, какой исполняемый файл будет запущен с помощью команды
Если вы хотите определить путь программным путем, вы используете неправильный обмен стека.
источник
-a
, отображаются все возможные совпадения. И есть также,whereis
кто ищет руководства и источники, тоже.Проблема простого решения
which
command
находит исполняемый файл данногоcommand
в вашем$PATH
. К сожалению, это не будет работать, как ожидалось, во всех случаях.Когда
command
это псевдоним или функция, вы не получите правильный результат, потому что сам исполняемый исполняемый файл может иметь совершенно другое имя. Например, во многих дистрибутивах Linuxll
псевдоним установлен по умолчанию.which ll
ничего не находит. Еще один проблемный случай, когда ваша оболочка ведет себя нестандартным образом и не запускает первыйcommand
найденный в$PATH
.Более надежное решение
В Linux, если вы хотите быть полностью уверены в пути к исполняемому файлу запущенного процесса, вы можете получить его из его PID (ID процесса; в приведенном ниже примере вместо числа введите
$PID
:)Как получить номер? PID последнего запуска процесса в оболочке в фоновом режиме
$!
. Небольшая демонстрация:Вы можете получить PID других процессов, например, из списка процессов, используя
ps -ef
.Объяснение:
/proc/$PID/exe
это символическая ссылка на исполняемый файл запущенного процесса. Командаreadlink
показывает цель, на которую указывает символическая ссылка.Скрипты - это особый случай
К сожалению,
readlink /proc/$PID/exe
метод не работает должным образом с языками сценариев, такими как bash, Perl, Python и т. Д. В таких случаях вы получите путь к интерпретатору сценария (например/bin/bash
) вместо пути к сценарию. Чтобы приблизиться к информации, вы можете использовать:К сожалению, текущий рабочий каталог может измениться с момента запуска программы. Некоторые интерпретаторы, такие как bash, могут сохранять файл сценария открытым в дескрипторе 255:
Все может измениться
Может вызвать любой процесс,
exec()
который заменяет его/proc/$PID/exe
,/proc/$PID/cmdline
и другую информацию.источник