Risposte:
È possibile utilizzare type
e which
per determinare in cosa bash
consiste 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 which
e type -P
funzionano 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 open
comando), 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.
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
type
e type -P
non lo fanno? Il codice non OSX funziona su OS X? In caso contrario, puoi spiegare perché no? Se sì, perché hai due versioni?
/bin
o /usr/bin
, ecc. Ma invece sono installate su /Applications/My3rdPartyApp.app
e il binario è archiviato in una sottodirectory Contents/MacOS
che 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
.
/usr/bin/firefox
realtà non è il binario di Firefox, quindi uso l'output di readlink
per individuare dove punta, e quindi trovo la defaluts/prefs
directory da lì. In una nota a margine, riguardo al symlinking: Doing ls -al /usr/bin/* |grep -- '->' |wc -l
illustra 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.
type -P
domanda, non ho abbastanza familiarità con quel comando per rispondere alla domanda. Forse puoi elaborare un po '. :)
type
perché 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)
Se il programma è in esecuzione, chiamare
ps -ef | grep PROGRAMM
Il percorso dei binari è indicato nella $PATH
variabile.
Puoi vederne il contenuto con env
.
$PATH
può essere visualizzato con env
, ma echo $PATH
sarebbe meno dettagliato.
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
Su MAC (OS X) puoi fare:
Ora puoi vedere il percorso completo della tua applicazione dalla riga di comando ed eseguirlo da lì, se lo desideri.
Tratto da wikihow