Как мне найти путь к программе в Терминале?


26

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

Ответы:


30

Вы можете использовать typeи, whichчтобы определить, что представляет собой определенная команда bash, и, если это приложение, где она находится.

$ type type
type is a shell builtin
$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type -P ls
/Users/danielbeck/bin/ls
$ which which
/usr/bin/which
$ which ls
/Users/danielbeck/bin/ls

Команды whichи type -Pработают только для программ на вашем PATH, конечно, но вы не сможете запускать другие, просто набрав их имя команды в любом случае.


Если вы ищете простой способ определить, где установлен пакет приложений OS X (GUI) (как используется, например, openкомандой), вы можете выполнить следующий короткий AppleScript из командной строки:

$ osascript -e 'tell application "System Events" to POSIX path of (file of process "Safari" as alias)'
/Applications/Safari.app

Это требует, чтобы рассматриваемая программа (Safari в примере) работала.


1
Есть ли способ получить тот же результат, что и ваш osascript, но без запуска программы?
Матье Вестфаль

3

В настоящее время это метод, с помощью которого я могу найти каталог приложений Firefox в OSX и Linux. Должно быть легко перенести в другое приложение. Протестировано на OSX 10.7, Ubuntu 12.04, Debian Jessie

#!/bin/bash

# Array of possible Firefox application names.
appnames=("IceWeasel" "Firefox")    # "Firefox" "IceWeasel" "etc

#
# Calls lsregister -dump and parses the output for "/Firefox.app", etc.
# Returns the very first result found.
#
function get_osx_ffdir()
{
    # OSX Array of possible lsregister command locations
    # I'm only aware of this one currently
    lsregs=("/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister")

    for i in "${lsregs[@]}"; do
        for j in ${appnames[@]}; do
            if [ -f $i ]; then
                # Some logic to parse the output from lsregister
                ffdir=$($i -dump |grep -E "/$j.app$" |cut -d'/' -f2- |head -1)
                ffdir="/$ffdir"
                return 0
            fi
        done
    done
    return 1
}

#
# Uses "which" and "readlink" to locate firefox on Linux, etc
#
function get_ffdir()
{
    for i in "${appnames[@]}"; do
        # Convert "Firefox" to "firefox", etc
        lower=$(echo "$i" |tr '[:upper:]' '[:lower:]')
        # Readlink uses the symlink to find the actual install location
        # will need to be removed for non-symlinked applications
        exec=$(readlink -f "$(which $lower)")
        # Assume the binary's parent folder is the actual application location
        ffdir=$(echo "$exec" |rev |cut -d'/' -f2- |rev)
        if [ -f "$ffdir" ]; then
            return 0
        fi
    done
    return 1

}


echo "Searching for Firefox..."

ffdir=""
if [[ "$OSTYPE" == "darwin"* ]]; then
    # Mac OSX
    get_osx_ffdir
else
    # Linux, etc
    get_ffdir
fi

echo "Found application here: $ffdir"

# TODO: Process failures, i.e. "$ffdir" == "" or "$?" != "0", etc

Это впечатляющий кусок кода. Это делает что-нибудь, что typeи type -Pнет? Работает ли не OSX-код на OS X? Если нет, можете ли вы объяснить, почему нет? Если да, то почему у вас есть две версии?
G-Man говорит: «Восстановите Монику»

1
@ G-Man: Из-за ограничений символов я отвечу на это в двух частях ... На OSX сторонние приложения не устанавливаются в /binили /usr/binи т. Д., А вместо этого устанавливаются в, /Applications/My3rdPartyApp.appа двоичный файл хранится в подкаталоге, Contents/MacOSчто делает его довольно Трудно использовать какие-либо кроссплатформенные методы для определения местоположения приложения (отсюда и использование lsregister). Хуже всего то, что структура каталогов OSX размещает двоичный файл отдельно от ресурсов. Фрагмент выше был написан, чтобы помочь найти каталог Firefox defaults/pref.
tresf

В Ubuntu на /usr/bin/firefoxсамом деле это не бинарный файл Firefox, поэтому я использую выходные данные, readlinkчтобы найти, куда он указывает, а затем найти defaluts/prefsкаталог оттуда. Кстати, о символьных ссылках: в этом ls -al /usr/bin/* |grep -- '->' |wc -lпримере показано, что около 303 двоичных файлов в моей директории Ubuntu являются символическими ссылками. (около 16% из них). По этой причине приведенный выше код ** в конечном итоге должен быть изменен, чтобы рекурсивно разрешать символические ссылки, пока он не найдет канонический путь к двоичному файлу.
Tresf

Наконец, чтобы ответить на type -Pвопрос, я недостаточно знаком с этой командой, чтобы ответить на вопрос. Возможно, вы можете уточнить немного. :)
tresf

Спасибо за подробный ответ. (Возможно, вы захотите отредактировать эту информацию в своем ответе.) Я упоминаю, typeпотому что она была основой первого (и принятого) ответа. Это встроенная оболочка, которая указывает, как указанные имена будут интерпретироваться, если они используются в качестве команд. Версия POSIX, которая довольно проста, описана здесь . … (Продолжение)
G-Man говорит: «Восстановите Монику»


0

Путь к двоичным файлам указан в $PATHпеременной.

Вы можете увидеть его содержание с env.


ошибка в ОС ... извините: '(
user209678

Ваш ответ не совсем ясен, извините. Что вы имеете в виду с "ошибка в ОС ... извините"? Также $PATHможно просмотреть с env, но echo $PATHбудет менее многословным.
Slhck

0

Вы можете использовать команду « alias » в терминале, чтобы получить список всех ваших псевдонимов. Или, если вы находитесь в каталоге, вы можете использовать « pwd », чтобы показать ваш текущий путь.

Если вы знаете имя файла или его часть, то вы можете использовать « find », чтобы найти ваш файл.

find / -name things.jpeg

0

На MAC (OS X) вы можете сделать:

  1. Найдите приложение в Finder.
  2. Щелкните правой кнопкой мыши приложение и выберите «Показать содержимое пакета».
  3. Найдите исполняемый файл: как правило, он находится в Contents → MacOS и имеет то же имя, что и приложение.
  4. Перетащите этот файл в пустую командную строку терминала.

Теперь вы можете увидеть полный путь к вашему приложению в командной строке и запустить его оттуда, если хотите.

Взято из вики-шоу

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.