Come trovo il percorso di un programma in Terminal?


26

Ho installato un'applicazione e ora posso accedervi tramite terminale come mia applicazione. È un alias, però. Come posso trovare il percorso completo del file?

Risposte:


30

È possibile utilizzare typee whichper determinare in cosa bashconsiste un determinato comando e, se si tratta di un'applicazione, dove risiede.

$ 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

I comandi whiche type -Pfunzionano solo per i programmi sul tuo PATH, ovviamente, ma non sarai in grado di eseguirne altri digitando comunque il loro nome di comando.


Se stai cercando un modo semplice per determinare dove è installato un bundle di applicazioni OS X (GUI) (come ad esempio utilizzato dal opencomando), puoi eseguire il seguente breve AppleScript dalla riga di comando:

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

Ciò richiede che il programma in questione (Safari nell'esempio) sia in esecuzione.


1
C'è un modo per ottenere lo stesso risultato del tuo JavaScript ma senza il programma in esecuzione?
Mathieu Westphal,

3

Questo è attualmente il metodo per individuare la directory dell'applicazione Firefox in OSX e Linux. Dovrebbe essere facile da adottare per un'altra applicazione. Testato su 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

È un codice impressionante. Fa fare tutto ciò che typee type -Pnon lo fanno? Il codice non OSX funziona su OS X? In caso contrario, puoi spiegare perché no? Se sì, perché hai due versioni?
G-Man dice "Ripristina Monica"

1
@ G-Man: a causa delle limitazioni dei caratteri, risponderò in due parti ... Su OSX, le applicazioni di terze parti non sono installate su /bino /usr/bin, ecc. Ma invece sono installate su /Applications/My3rdPartyApp.appe il binario è archiviato in una sottodirectory Contents/MacOSche lo rende abbastanza difficile usare qualsiasi tecnica multipiattaforma per determinare la posizione dell'applicazione (quindi l'uso di lsregister) Peggio ancora, la struttura della directory OSX posiziona il binario in una posizione separata dalle risorse. Lo snippet sopra è stato scritto per aiutare a individuare la directory di Firefox defaults/pref.
tresf,

Su Ubuntu, in /usr/bin/firefoxrealtà non è il binario di Firefox, quindi uso l'output di readlinkper individuare dove punta, e quindi trovo la defaluts/prefsdirectory da lì. In una nota a margine, riguardo al symlinking: Doing ls -al /usr/bin/* |grep -- '->' |wc -lillustra circa 303 binari in quella directory la mia configurazione di Ubuntu sono in realtà link simbolici. (circa il 16% di questi) Per questo motivo, il codice sopra riportato ** dovrebbe * eventualmente essere modificato per risolvere ricorsivamente i collegamenti simbolici fino a quando non trova il percorso canonico del binario.
tresf,

Infine, per rispondere alla type -Pdomanda, non ho abbastanza familiarità con quel comando per rispondere alla domanda. Forse puoi elaborare un po '. :)
tresf

Grazie per la risposta dettagliata. (Potresti voler modificare quelle informazioni nella tua risposta.) Cito typeperché era la base della prima (e accettata) risposta. È una shell incorporata che indica come i nomi specificati verrebbero interpretati se usati come comandi. La versione POSIX di esso, che è piuttosto spoglia, è descritta qui . ... (proseguendo)
G-Man dice "Ripristina Monica"

3

Se il programma è in esecuzione, chiamare

ps -ef | grep PROGRAMM

0

Il percorso dei binari è indicato nella $PATHvariabile.

Puoi vederne il contenuto con env.


errore in os ... scusa: '(
user209678

La tua risposta non è del tutto chiara, scusa. Cosa intendi con "errore in os ... scusa"? Anche il $PATHpuò essere visualizzato con env, ma echo $PATHsarebbe meno dettagliato.
slhck,

0

Puoi usare il comando " alias " nel terminale per elencare tutti i tuoi alias. Oppure, se ci si trova in una directory, è possibile utilizzare " pwd " per mostrare il percorso corrente.

Se conosci il nome file o una parte del nome file, puoi utilizzare " trova " per individuare il file.

find / -name things.jpeg

0

Su MAC (OS X) puoi fare:

  1. Individua l'applicazione nel Finder.
  2. Fare clic con il tasto destro del mouse sull'applicazione e selezionare "Mostra contenuto pacchetto".
  3. Individua il file eseguibile: in genere si trova in Contenuti → MacOS e ha lo stesso nome dell'applicazione.
  4. Trascina quel file nella riga di comando del Terminale vuota.

Ora puoi vedere il percorso completo della tua applicazione dalla riga di comando ed eseguirlo da lì, se lo desideri.

Tratto da wikihow

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.