¿Cómo encuentro la ruta a un programa en la Terminal?

26

Instalé una aplicación y ahora puedo acceder a ella a través del terminal como myapplication. Sin embargo, es un alias. ¿Cómo puedo encontrar la ruta completa al archivo?

Xitrum
fuente

Respuestas:

30

Puede usar typey whichpara determinar en qué bashconsiste un determinado comando y, si es una aplicación, dónde reside.

$ 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

Los comandos whichy type -Psolo funcionan para programas en su PATH, por supuesto, pero no podrá ejecutar otros simplemente escribiendo su nombre de comando de todos modos.


Si está buscando una manera simple de determinar dónde está instalado un paquete de aplicación OS X (GUI) (como lo usa, por ejemplo, el opencomando), puede ejecutar el siguiente AppleScript corto desde la línea de comandos:

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

Esto requiere que el programa en cuestión (Safari en el ejemplo) se esté ejecutando.

Daniel Beck
fuente
1
¿Hay alguna manera de obtener el mismo resultado que su osascript pero sin ejecutar el programa?
Mathieu Westphal
3

Este es el método que actualmente uso para localizar el directorio de la aplicación Firefox en OSX y Linux. Debería ser fácil de adoptar para otra aplicación. Probado en 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
fuente
Esa es una impresionante tirada de código. ¿Hace algo que typey type -Pno lo hacen? ¿El código que no es OSX funciona en OS X? Si no, ¿puedes explicar por qué no? En caso afirmativo, ¿por qué tienes dos versiones?
G-Man dice 'Restablecer a Monica'
1
@ G-Man: Debido a las limitaciones de caracteres, voy a responder a esto en dos partes ... En OS X, las aplicaciones 3 ª parte no se instalan a /bino /usr/bin, etc, pero en vez instalado para /Applications/My3rdPartyApp.appy el binario se almacena en un subdirectorio Contents/MacOSpor lo que es bastante difícil de usar cualquier técnica multiplataforma para determinar la ubicación de la aplicación (de ahí el uso de lsregister) Peor aún, la estructura del directorio OSX coloca el binario en una ubicación separada de los recursos. El fragmento anterior se escribió para ayudar a localizar el defaults/prefdirectorio de Firefox .
tresf
En Ubuntu, en /usr/bin/firefoxrealidad no es el binario de Firefox, por lo que utilizo la salida de readlinkpara localizar a dónde apunta y luego encontrar el defaluts/prefsdirectorio desde allí. En una nota al margen, sobre el enlace simbólico: Hacer ls -al /usr/bin/* |grep -- '->' |wc -lilustra unos 303 binarios en ese directorio, mi configuración de Ubuntu son en realidad enlaces simbólicos. (alrededor del 16% de ellos) Por esta razón, el código anterior ** debería * eventualmente modificarse para resolver enlaces simbólicos de forma recursiva hasta que encuentre la ruta canónica al binario.
tresf
Por último, para responder la type -Ppregunta, no estoy lo suficientemente familiarizado con ese comando para responder la pregunta. Quizás puedas elaborar un poco. :)
tresf
Gracias por la respuesta detallada. (Es posible que desee editar esa información en su respuesta). Menciono typeporque fue la base de la primera respuesta (y aceptada). Es un shell incorporado que indica cómo se interpretarían los nombres especificados si se usaran como comandos. Aquí se describe la versión POSIX, que es bastante básica . … (Continúa)
G-Man dice 'Restablecer a Mónica'
3

Si el programa se está ejecutando, llame

ps -ef | grep PROGRAMM
Matthias M
fuente
0

La ruta de los binarios se referencia en la $PATHvariable.

Puedes ver su contenido con env.

usuario209678
fuente
error en os ... lo siento: '(
user209678
Su respuesta no es del todo clara, lo siento. ¿Qué quieres decir con "error en os ... lo siento"? También $PATHse puede ver con env, pero echo $PATHsería menos detallado.
slhck
0

Puede usar el comando " alias " en la terminal para enumerar todos sus alias. O si está en un directorio, puede usar " pwd " para mostrar su ruta actual.

Si conoce el nombre del archivo o una parte del mismo, puede usar " buscar " para ubicar su archivo.

find / -name things.jpeg
Steve Butabi
fuente
0

En MAC (OS X) puedes hacer:

  1. Localiza la aplicación en Finder.
  2. Haga clic derecho en la aplicación y seleccione "Mostrar contenido del paquete".
  3. Localice el archivo ejecutable: por lo general, se encuentra en Contenido → MacOS y tiene el mismo nombre que la aplicación.
  4. Arrastre ese archivo a su línea de comando Terminal en blanco.

Ahora puede ver la ruta completa a su aplicación en la línea de comando y ejecutarla desde allí si lo desea.

Tomado de wikihow

Alex Sed
fuente