Когда я набираю имя некоторого исполняемого файла в командной строке, и он запускается, как я могу определить путь, где расположен этот исполняемый файл?
2 ответа
Вы можете узнать, какой исполняемый файл будет запущен с помощью команды
which <command>
Если вы хотите определить путь программным путем, вы используете неверный обмен стека.
Проблема простого решения
which
command
находит исполняемый файл данной 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
и другую информацию.