Wie finde ich den Pfad zu einem Programm in Terminal?

26

Ich habe eine Anwendung installiert und kann nun über das Terminal auf sie zugreifen. Es ist jedoch ein Alias. Wie finde ich den vollständigen Pfad zur Datei?

Xitrum
quelle

Antworten:

30

Sie können mit typeund whichbestimmen, was ein bestimmter Befehl enthält bashund wo er sich befindet, wenn es sich um eine Anwendung handelt.

$ 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

Die Befehle whichund type -Pnur Arbeit für Programme auf PATH, natürlich, aber Sie werden andere nicht ohnehin nur die Eingabe ihre Befehlsnamen in der Lage zu laufen.


Wenn Sie nach einer einfachen Möglichkeit suchen, um festzustellen, wo ein OS X (GUI) -Anwendungspaket installiert ist (wie es z. B. vom openBefehl verwendet wird), können Sie das folgende kurze AppleScript über die Befehlszeile ausführen:

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

Dies setzt voraus, dass das betreffende Programm (im Beispiel Safari) ausgeführt wird.

Daniel Beck
quelle
1
Gibt es eine Möglichkeit, dasselbe Ergebnis wie bei Ihrem Javascript zu erzielen, ohne dass das Programm ausgeführt wird?
Mathieu Westphal
3

Dies ist die Methode, mit der ich derzeit das Firefox-Anwendungsverzeichnis unter OSX und Linux finde. Sollte leicht auf eine andere Anwendung zu übertragen sein. Getestet unter 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
quelle
Das ist eine beeindruckende Menge Code. Tut es etwas das typeund type -Pnicht? Funktioniert der Nicht-OSX-Code unter OS X? Wenn nicht, können Sie erklären, warum nicht? Wenn ja, warum haben Sie zwei Versionen?
G-Man sagt, dass Monica
1
@ G-Man: Aufgrund Zeichenbeschränkungen, ich das in zwei Teilen beantworten würde ... Auf OSX, sind 3rd - Party - Anwendungen nicht installiert /binoder /usr/binetc , sondern installiert /Applications/My3rdPartyApp.appund die binären wird in einem Unterverzeichnis gespeichert Contents/MacOSes recht machen Es ist schwierig, plattformübergreifende Techniken zu verwenden, um den Speicherort der Anwendung zu bestimmen (daher die Verwendung von lsregister). Das obige Snippet wurde geschrieben, um das Auffinden von Firefoxs Verzeichnis zu defaults/preferleichtern.
Dienstag,
Unter Ubuntu /usr/bin/firefoxist Firefox eigentlich keine Binärdatei, daher benutze ich die Ausgabe von readlink, um herauszufinden, wohin es zeigt, und finde dann das defaluts/prefsVerzeichnis von dort. Als Randnotiz zum Symlinking: Doing ls -al /usr/bin/* |grep -- '->' |wc -lillustriert ungefähr 303 Binärdateien in diesem Verzeichnis, bei denen es sich in meiner Ubuntu-Konfiguration tatsächlich um Symlinks handelt. (ungefähr 16% von ihnen) Aus diesem Grund sollte der obige Code ** eventuell geändert werden, um Symlinks rekursiv aufzulösen, bis der kanonische Pfad zur Binärdatei gefunden wird.
Tresf
Um die type -PFrage zu beantworten , bin ich mit diesem Befehl nicht vertraut genug, um die Frage zu beantworten. Vielleicht können Sie etwas näher darauf eingehen. :)
tresf
Danke für die ausführliche Antwort. (Vielleicht haben Sie wollen bearbeiten , dass die Informationen in Ihre Antwort.) Ich erwähne , typeweil es die Grundlage der ersten (und akzeptiert) Antwort war. Es handelt sich um eine integrierte Shell, die angibt, wie angegebene Namen interpretiert würden, wenn sie als Befehle verwendet würden. Die POSIX-Version davon, die eher nackt ist, wird hier beschrieben . … (Fortsetzung)
G-Man sagt, dass Monica
3

Wenn das Programm ausgeführt wird, rufen Sie auf

ps -ef | grep PROGRAMM
Matthias M
quelle
0

Auf den Pfad der Binärdateien wird in der verwiesen $PATH Variablen .

Sie können den Inhalt mit sehen env.

user209678
quelle
Fehler in os ... Entschuldigung: '(
user209678
Ihre Antwort ist leider nicht ganz klar. Was meinst du mit "error in os ... sorry"? Auch das $PATHkann man mit ansehen env, echo $PATHwäre aber weniger ausführlich.
Slhck
0

Sie können den Befehl " alias " im Terminal verwenden, um alle Aliase aufzulisten. Oder wenn Sie sich in einem Verzeichnis befinden, können Sie " pwd " verwenden " verwenden, um Ihren aktuellen Pfad .

Wenn Sie den Dateinamen oder einen Teil des Dateinamens kennen, können Sie " find " verwenden, um Ihre Datei zu finden.

find / -name things.jpeg
Steve Butabi
quelle
0

Unter MAC (OS X) können Sie Folgendes tun:

  1. Suchen Sie die Anwendung im Finder.
  2. Klicken Sie mit der rechten Maustaste auf die Anwendung und wählen Sie "Paketinhalt anzeigen".
  3. Suchen Sie die ausführbare Datei: In der Regel befindet sich diese unter Inhalt → MacOS und hat denselben Namen wie die Anwendung.
  4. Ziehen Sie diese Datei auf Ihre leere Terminal-Befehlszeile.

Jetzt können Sie den vollständigen Pfad zu Ihrer Anwendung in der Befehlszeile anzeigen und von dort aus ausführen, wenn Sie möchten.

Entnommen aus wikihow

Alex Sed
quelle