Если вы хотите узнать, какую именно программу запустит имя команды в текущей сессии Терминала на Mac, сначала спросите у zsh, как он интерпретирует это имя, а затем выполните поиск исполняемых файлов в PATH. Это важно, поскольку команда может указывать на псевдоним (alias) или функцию оболочки еще до того, как оболочка дойдет до поиска файла. В macOS оболочкой по умолчанию в Терминале является zsh, хотя в профиле Терминала или администратором может быть выбрана другая оболочка. Руководство Apple по Терминалу

Спросите у zsh, что означает имя команды

В Терминале выполните whence -v с именем команды, без аргументов, которые привели бы к ее запуску. Например:

whence -v python3

Вывод определит тип команды, который использовал бы zsh: это может быть псевдоним (alias), функция, встроенная команда (builtin) или внешняя команда. Если отображается alias или функция, само имя не указывает напрямую на исполняемый файл, который будет запущен; alias или функция могут раскрываться в другую команду или выполнять несколько команд. В документации zsh команда whence описана как способ узнать, как именно интерпретируется имя. Документация по встроенным командам zsh

Для получения краткого обозначения типа используйте:

whence -w python3

Если результат — function, проверьте определение с помощью functions python3. Если это alias, проверьте его с помощью alias python3. Эти команды выводят текущее определение в оболочке; они не запускают сам целевой объект. Функция может вызывать другую функцию или внешнюю программу, поэтому прослеживайте цепочку определений, пока не дойдете до команды, выполняющей фактическую работу.

Поиск исполняемых файлов в PATH

Чтобы найти файл, который zsh нашел бы через PATH, даже если имя перекрыто псевдонимом или функцией, используйте:

whence -p python3

Чтобы вывести все совпадающие записи в PATH, используйте:

whence -pa python3

Опция -p указывает zsh выполнять поиск в PATH независимо от определений на уровне оболочки, а -a выводит все совпадения, а не только первое. Первое совпадение в PATH — это исполняемый файл, который zsh выбрал бы при обычном поиске внешней команды. zsh также может показать, куда ведет символическая ссылка, с помощью whence -ps python3. Документация по встроенным командам zsh

Список PATH относится к текущему окружению оболочки. Посмотреть входящие в него каталоги можно с помощью print -r -- $PATH; zsh представляет параметр path как строку с разделителями-двоеточиями в таком формате. Изменение порядка каталогов в PATH может повлиять на то, какое из совпадающих имен будет найдено первым. Apple описывает PATH как список каталогов, в которых оболочка ищет команды, и отмечает, что настройки окружения оболочки привязаны к конкретному контексту их выполнения. Apple: Использование переменных среды в Терминале на Mac

Проверьте, как была вызвана команда

Команда, записанная со слэшем, например ./python3 или /opt/tools/python3, явно задает путь, вместо того чтобы запрашивать у оболочки поиск имени в PATH. Относительный путь ./python3 указывает на файл в текущем каталоге. В руководстве Apple по командной строке поясняется, что имя без начального слэша при использовании в качестве пути считается относительным по отношению к текущему каталогу, а запись ./ явно запускает программу из текущего каталога. Apple: Command Line Primer

Для простого имени, такого как python3, проверьте как его тип в оболочке, так и совпадения в PATH. Для пути, содержащего /, проверяйте именно этот конкретный файл. Заключайте в кавычки пути, содержащие пробелы или метасимволы оболочки, при их выполнении; например, "/Applications/Tool Folder/tool". В руководстве Apple описано использование кавычек или экранирование специальных символов в путях. Это позволяет найти вызываемый файл, не меняя способа запуска команды.

Что не может доказать этот поиск

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

Кроме того, нахождение пути к файлу само по себе не доказывает, что именно этот процесс в конечном итоге выполняется во всех случаях: файл может оказаться символической ссылкой, скриптом, запускающим другую программу, или загрузчиком (launcher). Команда whence -ps может показать, куда ведет символическая ссылка, но для отслеживания дальнейшего поведения скрипта потребуется изучить сам скрипт или документацию программы. Если whence -p не возвращает путь, значит, для этого имени нет совпадений в PATH текущей оболочки; при этом команда все равно может быть псевдонимом, функцией, встроенной командой или программой, доступной только по явному пути.

Для стандартной проверки сначала выполните whence -v name, проверьте найденный alias или функцию, а затем используйте whence -pa name, чтобы сопоставить кандидаты среди исполняемых файлов. Эта последовательность позволит узнать как то, что распознает zsh, так и то, какой файл нашел бы поиск в PATH.

Источники