Réponses:
Vous pouvez utiliser type
et which
pour déterminer en quoi bash
consiste 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 which
et type -P
ne 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 open
commande), 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.
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
type
et type -P
pas? Le code non OSX fonctionne-t-il sur OS X? Sinon, pouvez-vous expliquer pourquoi? Si oui, pourquoi avez-vous deux versions?
/bin
ou /usr/bin
, etc. mais à la place sont installées dans /Applications/My3rdPartyApp.app
et le binaire est stocké dans un sous-répertoire, Contents/MacOS
ce 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
.
/usr/bin/firefox
n'est pas vraiment le binaire Firefox, donc j'utilise la sortie de readlink
pour localiser où il pointe, puis je trouve le defaluts/prefs
répertoire à partir de là. Sur une note latérale, à propos du lien symbolique: Faire ls -al /usr/bin/* |grep -- '->' |wc -l
illustre 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.
type -P
question, je ne connais pas suffisamment cette commande pour répondre à la question. Vous pouvez peut-être élaborer un peu. :)
type
parce 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)
Si le programme est en cours d'exécution, appelez
ps -ef | grep PROGRAMM
Le chemin des binaires est référencé dans la $PATH
variable.
Vous pouvez voir son contenu avec env
.
$PATH
peut également être consulté avec env
, mais echo $PATH
serait moins verbeux.
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
Sur MAC (OS X), vous pouvez faire:
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