Як знайти шлях до програми в Терміналі?


26

Я встановив додаток, і тепер я можу отримати доступ до нього через термінал як myapplication. Але це псевдонім. Як я можу знайти повний шлях до файлу?

Відповіді:


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символічне посилання: Doing ілюструє близько 303 бінарних файлів у цьому каталозі, моя конфігурація Ubuntu насправді є посиланнями. (приблизно 16% з них). З цієї причини, вищезгаданий код ** слід * врешті-решт модифікувати, щоб вирішувати символьні посилання рекурсивно, поки не знайде канонічний шлях до двійкового.
tresf

Нарешті, щоб відповісти на type -Pзапитання, я недостатньо знайомий з цією командою, щоб відповісти на питання. Можливо, ви можете трохи допрацювати. :)
tresf

Дякуємо за детальну відповідь. (Ви можете відредагувати цю інформацію у своїй відповіді.) Я згадую, typeтому що вона була основою першої (і прийнятої) відповіді. Це вбудована оболонка, яка вказує, як інтерпретуються вказані імена, якщо вони використовуються як команди. Версія POSIX з нього, що є досить скелетних, описана тут . … (Продовжував)
G-Man каже: «Відновити Моніку»


0

Шлях бінарних файлів посилається на $PATHзмінну.

Ви можете бачити його вміст за допомогою env.


помилка в os ... вибачте: '(
user209678

Ваша відповідь не зовсім ясна, вибачте. Що ви маєте на увазі під "помилкою в os ... вибачте"? Також $PATHможна переглядати env, але echo $PATHбуде менш багатослівним.
slhck

0

Ви можете використовувати команду " псевдонім " у терміналі, щоб перелічити всі псевдоніми. Або якщо ви знаходитесь в каталозі, ви можете використовувати " pwd ", щоб показати свій поточний шлях.

Якщо ви знаєте ім'я файлу або частину імені файлу, тоді ви можете використовувати " знайти ", щоб знайти свій файл.

find / -name things.jpeg

0

На MAC (OS X) ви можете:

  1. Знайдіть додаток у Finder.
  2. Клацніть програму правою кнопкою миші та виберіть "Показати зміст пакета".
  3. Знайдіть виконуваний файл: як правило, це вміст → MacOS і має те саме ім'я, що і додаток.
  4. Перетягніть цей файл у порожній командний рядок терміналу.

Тепер ви можете побачити повний шлях до вашої програми в командному рядку і запустити її звідти, якщо хочете.

Взяті з wikihow

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.