Comment trouver le chemin d'accès à un programme dans Terminal?

26

J'ai installé une application et maintenant je peux y accéder via le terminal comme mon application. C'est un alias, cependant. Comment puis-je trouver le chemin d'accès complet au fichier?

Xitrum
la source

Réponses:

30

Vous pouvez utiliser typeet whichpour déterminer en quoi bashconsiste une certaine commande et, s'il s'agit d'une application, où elle réside.

$ 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

Les commandes whichet type -Pne fonctionnent que pour les programmes sur votre PATH, bien sûr, mais vous ne pourrez pas en exécuter d'autres en tapant simplement leur nom de commande de toute façon.


Si vous cherchez un moyen simple de déterminer où un ensemble d'applications OS X (GUI) est installé (tel qu'utilisé par exemple par la opencommande), vous pouvez exécuter le court AppleScript suivant à partir de la ligne de commande:

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

Cela nécessite que le programme en question (Safari dans l'exemple) soit en cours d'exécution.

Daniel Beck
la source
1
Existe-t-il un moyen d'obtenir le même résultat que votre Javascript mais sans que le programme ne fonctionne?
Mathieu Westphal
3

C'est la méthode que j'utilise actuellement pour localiser le répertoire de l'application Firefox sous OSX et Linux. Devrait être facile à adopter dans une autre application. Testé sur 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
la source
C'est un impressionnant lot de code. Est-ce que ça fait quelque chose typeet type -Ppas? Le code non OSX fonctionne-t-il sur OS X? Sinon, pouvez-vous expliquer pourquoi? Si oui, pourquoi avez-vous deux versions?
G-Man dit `` Réintègre Monica ''
1
@ G-Man: En raison des limitations de caractères, je vais répondre à cela en deux parties ... Sur OSX, les applications tierces ne sont pas installées dans /binou /usr/bin, etc. mais à la place sont installées dans /Applications/My3rdPartyApp.appet le binaire est stocké dans un sous-répertoire, Contents/MacOSce qui le rend assez difficile d'utiliser des techniques multiplateformes pour déterminer l'emplacement de l'application (d'où l'utilisation de lsregister) Pire encore, la structure de répertoires OSX place le binaire dans un emplacement distinct des ressources. L'extrait ci-dessus a été écrit pour aider à localiser le répertoire de Firefox defaults/pref.
tresf
Sur Ubuntu, ce /usr/bin/firefoxn'est pas vraiment le binaire Firefox, donc j'utilise la sortie de readlinkpour localiser où il pointe, puis je trouve le defaluts/prefsrépertoire à partir de là. Sur une note latérale, à propos du lien symbolique: Faire ls -al /usr/bin/* |grep -- '->' |wc -lillustre environ 303 binaires dans ce répertoire, ma configuration Ubuntu sont en fait des liens symboliques. (environ 16% d'entre eux) Pour cette raison, le code ci-dessus ** devrait * éventuellement être modifié pour résoudre les liens symboliques de manière récursive jusqu'à ce qu'il trouve le chemin canonique vers le binaire.
tresf
Enfin, pour répondre à la type -Pquestion, je ne connais pas suffisamment cette commande pour répondre à la question. Vous pouvez peut-être élaborer un peu. :)
tresf
Merci pour la réponse détaillée. (Vous voudrez peut-être modifier ces informations dans votre réponse.) Je mentionne typeparce que c'était la base de la première réponse (et acceptée). Il s'agit d'un shell intégré qui indique comment les noms spécifiés seraient interprétés s'ils étaient utilisés comme commandes. La version POSIX de celui-ci, qui est plutôt simple, est décrite ici . … (Suite)
G-Man dit «Réintègre Monica»
3

Si le programme est en cours d'exécution, appelez

ps -ef | grep PROGRAMM
Matthias M
la source
0

Le chemin des binaires est référencé dans la $PATHvariable.

Vous pouvez voir son contenu avec env.

user209678
la source
erreur dans le système d'exploitation ... désolé: '(
user209678
Votre réponse n'est pas entièrement claire, désolé. Que voulez-vous dire par "erreur dans le système d'exploitation ... désolé"? Le $PATHpeut également être consulté avec env, mais echo $PATHserait moins verbeux.
slhck
0

Vous pouvez utiliser la commande " alias " dans le terminal pour répertorier tous vos alias. Ou si vous êtes dans un répertoire, vous pouvez utiliser " pwd " pour afficher votre chemin actuel.

Si vous connaissez le nom de fichier ou une partie du nom de fichier, vous pouvez utiliser " rechercher " pour localiser votre fichier.

find / -name things.jpeg
Steve Butabi
la source
0

Sur MAC (OS X), vous pouvez faire:

  1. Localisez l'application dans le Finder.
  2. Cliquez avec le bouton droit sur l'application et sélectionnez «Afficher le contenu du package».
  3. Localisez le fichier exécutable: il se trouve généralement dans Contents → MacOS et porte le même nom que l'application.
  4. Faites glisser ce fichier sur votre ligne de commande Terminal vierge.

Vous pouvez maintenant voir le chemin complet de votre application sur la ligne de commande et l'exécuter à partir de là si vous le souhaitez.

Tiré de wikihow

Alex Sed
la source