Jak znaleźć ścieżkę do programu w terminalu?

26

Zainstalowałem aplikację i teraz mogę uzyskać do niej dostęp za pośrednictwem terminala jako mojej aplikacji. Jest to jednak pseudonim. Jak znaleźć pełną ścieżkę do pliku?

Xitrum
źródło

Odpowiedzi:

30

Możesz użyć typei, whichaby określić, w czym znajduje się określone polecenie bash, a jeśli jest to aplikacja, w której się znajduje.

$ 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

Polecenia whichi type -Ptylko praca dla programów na PATH, oczywiście, ale nie będzie w stanie uruchomić innym poprzez wpisanie ich nazwy polecenia tak.


Jeśli szukasz prostego sposobu ustalenia, gdzie jest zainstalowany pakiet aplikacji OS X (GUI) (jak np. W openpoleceniu), możesz wykonać następujący krótki AppleScript z wiersza poleceń:

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

Wymaga to uruchomienia danego programu (w tym przykładzie Safari).

Daniel Beck
źródło
1
Czy istnieje sposób, aby uzyskać taki sam wynik jak osascript, ale bez uruchamiania programu?
Mathieu Westphal
3

Jest to metoda, którą obecnie znajduję katalog aplikacji Firefox w OSX i Linux. Powinno być łatwe do dostosowania do innej aplikacji. Testowane na 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
tresf
źródło
To imponujący kawałek kodu. Czy robi coś takiego, typea type -Pnie robi? Czy kod inny niż OSX działa w systemie OS X? Jeśli nie, czy możesz wyjaśnić, dlaczego nie? Jeśli tak, to dlaczego masz dwie wersje?
G-Man mówi „Przywróć Monikę”
1
@ G-Man: Z powodu ograniczeń znaków odpowiem na to w dwóch częściach ... W OSX aplikacje innych firm nie są instalowane w /binlub /usr/binitp., Ale zamiast tego są instalowane w, /Applications/My3rdPartyApp.appa plik binarny jest przechowywany w podkatalogu, Contents/MacOSco czyni go dość trudno jest użyć jakichkolwiek wieloplatformowych technik do określenia lokalizacji aplikacji (stąd zastosowanie lsregister) Co gorsza, struktura katalogów OSX umieszcza plik binarny w innym miejscu niż zasoby. Powyższy fragment został napisany, aby pomóc w zlokalizowaniu katalogu Firefoksa defaults/pref.
tresf
W systemie Ubuntu /usr/bin/firefoxnie jest tak naprawdę plikiem binarnym Firefoksa, więc używam danych wyjściowych do, readlinkaby zlokalizować, gdzie wskazuje, a następnie znaleźć defaluts/prefskatalog z tego miejsca. Na marginesie, o symlinkowaniu: Wykonanie ls -al /usr/bin/* |grep -- '->' |wc -lilustruje około 303 plików binarnych w tym katalogu, moja konfiguracja Ubuntu to tak naprawdę symlinks. (około 16% z nich) Z tego powodu powyższy kod ** powinien * zostać ostatecznie zmodyfikowany w celu rekurencyjnego rozwiązywania dowiązań symbolicznych, dopóki nie znajdzie kanonicznej ścieżki do pliku binarnego.
tresf
Wreszcie, aby odpowiedzieć na type -Ppytanie, nie znam wystarczająco tego polecenia, aby odpowiedzieć na pytanie. Być może możesz trochę rozwinąć. :)
tresf
Dziękuję za szczegółową odpowiedź. (Być może zechcesz edytować te informacje w swojej odpowiedzi.) Wspominam, typeponieważ była to podstawa pierwszej (i zaakceptowanej) odpowiedzi. Jest to wbudowana powłoka, która wskazuje, w jaki sposób określone nazwy będą interpretowane, jeśli zostaną użyte jako polecenia. Jego wersja POSIX, która jest raczej goła, została opisana tutaj . … (Ciąg dalszy)
G-Man mówi „Przywróć Monikę”
3

Jeśli program jest uruchomiony, zadzwoń

ps -ef | grep PROGRAMM
Matthias M.
źródło
0

Ścieżka plików binarnych jest wskazywana w $PATHzmiennej.

Możesz zobaczyć jego zawartość za pomocą env.

użytkownik209678
źródło
błąd w os ... przepraszam: '(
user209678
Twoja odpowiedź nie jest do końca jasna, przepraszam. Co masz na myśli przez „błąd w os… przepraszam”? Również $PATHmogą być oglądane z env, ale echo $PATHbyłoby mniej gadatliwy.
slhck
0

Możesz użyć polecenia „ alias ” w terminalu, aby wyświetlić listę wszystkich swoich aliasów. Lub jeśli jesteś w katalogu, możesz użyć „ pwd ”, aby pokazać swoją bieżącą ścieżkę.

Jeśli znasz nazwę pliku lub jego część, możesz użyć polecenia „ znajdź ”, aby zlokalizować plik.

find / -name things.jpeg
Steve Butabi
źródło
0

Na MAC (OS X) możesz:

  1. Znajdź aplikację w Finderze.
  2. Kliknij aplikację prawym przyciskiem myszy i wybierz „Pokaż zawartość opakowania”.
  3. Znajdź plik wykonywalny: Zazwyczaj jest to w Spisie treści → MacOS i ma taką samą nazwę jak aplikacja.
  4. Przeciągnij ten plik do pustego wiersza poleceń terminalu.

Teraz możesz zobaczyć pełną ścieżkę do aplikacji w wierszu poleceń i uruchomić ją stamtąd, jeśli chcesz.

Zaczerpnięte z wikihow

Alex Sed
źródło