7 votos

Cómo obtener una ruta de acceso ejecutable de aplicación de Terminal

En macOS, se pueden iniciar aplicaciones desde la línea de comandos con `` .

Me gustaría saber si hay un comando que devuelve el ejecutable dentro del paquete de aplicación, cuando no se ejecuta la aplicación, estoy esperando para algo como esto:

13voto

Phill Puntos 126

Me gustaría saber si existe un comando que devuelve el ejecutable dentro del paquete de la aplicación

No existe tal comando, pero he escrito un script de shell que hace exactamente eso para cualquier paquete de la aplicación en el sistema de archivos de su disco de inicio.

Utiliza varias herramientas de línea de comandos incluidos en macOS y aprovecha la documentación de Apple en el Lanzamiento de los Servicios, la Aplicación de Paquetes y el Núcleo de la Fundación Llaves. El script hace lo siguiente:

  1. Búsquedas /Applications para el paquete de la aplicación.
  2. Si no se puede encontrar en /Applications, las consultas de los Servicios de Lanzamiento de la base de datos, sólo considerando la aplicación de los fardos en el disco de inicio.
  3. Si un paquete de la aplicación se encuentra, inspecciona el paquete Info.plist y busca una clave denominadaCFBundleExecutable que almacena el archivo ejecutable (ver más abajo en el fondo de la sección de información para más sobre esto). De lo contrario, imprimir un mensaje de error en una salida.
  4. Imprime la ruta de acceso al ejecutable a la salida estándar.

La secuencia de comandos comprende tanto el nombre de una aplicación con o sin su extensión, comprueba los argumentos, muestra un mensaje de uso y una breve descripción si se ejecuta sin argumentos y devuelve un estado de salida con un mensaje de error si es necesario.

Desde la secuencia de comandos de búsquedas /Applications y puede hacer un consumo de tiempo de consulta a Servicios de Lanzamiento, no es super rápido (de ~ 1 segundo hasta varios segundos), pero era 100% de precisión en mis pruebas.

Este es el script, con explicaciones sobre lo que se hace en cada paso:

#!/bin/bash

# https://apple.stackexchange.com/a/334635
# Variables    
app_name="";
app_path_and_name="";
path_to_lsregister="/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/";

# If run without arguments, issue a usage summary and exit
if [[ "$1" == "" ]]; then
    echo "$(basename $0): returns name of bundle applications's executable file";
    echo "usage: $(basename $0) [application name]"; 
    exit 0;
fi;

# If argument doesn't end with '.app', append it
if [[ "$1" =~ \.app$ ]]; then
    app_name="$1"
else
    app_name="$1.app";
fi;

# Look for the path of the application bundle
# Search /Applicatinos first
app_path_and_name="$(find /Applications -type d -name "$app_name" -maxdepth 5 | grep -m 1 "$app_name")";
# If not found, search the the LaunchServices database (this is the time-consuming task)
test "$app_path_and_name" || app_path_and_name="$($path_to_lsregister/lsregister -dump | grep -v /Volumes | egrep --max-count 1 "/$app_name$" | sed 's:.* \(/.*\):\1:')"
# Check if Info.plist exists and is readable
if [[ -r "$app_path_and_name/Contents/Info.plist" ]]; then
    # Extract the CFBundleExecutable key that contains the name of the executable and print it to standard output
    echo "$app_path_and_name/MacOS/$(defaults read "$app_path_and_name/Contents/Info.plist" CFBundleExecutable)";
    exit 0;
else
    echo "Application '$1' not found";
    exit 1
fi

Puede guardar el archivo (por ejemplo pbex "print bundle ejecutables") y hacerlo ejecutable de la siguiente manera:

chmod a+x pbex

Si usted prefiere una función, utilice este lugar:

function pbex ()
{ 
    # https://apple.stackexchange.com/a/334635
    # Variables
    local app_name="";
    local app_path_and_name="";
    local path_to_lsregister="/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/";

    # If run without arguments, issue a usage summary and exit
    if [[ "$1" == "" ]]; then
        echo "$FUNCNAME: returns name of bundle applications's executable file";
        echo "usage: $FUNCNAME [application name]"; 
        return 0;
    fi;

    # If argument doesn't end with '.app', append it
    if [[ "$1" =~ \.app$ ]]; then
        app_name="$1"
    else
        app_name="$1.app";
    fi;

    # Look for the path of the application bundle
    # Search /Applicatinos first
    app_path_and_name="$(find /Applications -type d -name "$app_name" -maxdepth 5 | grep -m 1 "$app_name")";
    # If not found, search the LaunchServices database (this is the time-consuming step)
    test "$app_path_and_name" || app_path_and_name="$($path_to_lsregister/lsregister -dump | grep -v /Volumes | egrep --max-count 1 "/$app_name$" | sed 's:.* \(/.*\):\1:')"
    # Check if Info.plist exists and is readable
    if [[ -r "$app_path_and_name/Contents/Info.plist" ]]; then
        # Extract the CFBundleExecutable key that contains the name of the executable and print it to standard output
        echo "$app_path_and_name/MacOS/$(defaults read "$app_path_and_name/Contents/Info.plist" CFBundleExecutable)";
        return 0;
    else
        echo "Application '$1' not found";
        return 1
    fi
}

Sólo tienes que añadir a .bashrc, fuente:

. .bashrc

para utilizar la función.

Si usted necesita para ejecutar como un (bastante largo) "una sola línea", el uso (reemplace <app name> con el nombre de la aplicación sin el .extensión de la aplicación):

bash -c "app_name=\"<app name>\.app"; app_path_and_name=\"\"; if [[ \"\$app_name\" == \"\" ]]; then exit 2; fi; app_path_and_name=\"\$(find /Applications -type d -name \"\$app_name\" -maxdepth 5 | grep -m 1 \"\$app_name\")\"; test \"\$app_path_and_name\" || app_path_and_name=\"\$(/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -v /Volumes | egrep --max-count 1 \"/\$app_name\$\" | sed \"s:.* \(/.*\):\1:\")\"; if [[ -r \"\$app_path_and_name/Contents/Info.plist\" ]]; then echo \"\$app_path_and_name/MacOS/\$(defaults read \"\$app_path_and_name/Contents/Info.plist\" CFBundleExecutable)\"; exit 0; else echo \"Application \"\$app_name\" not found\"; exit 1; fi"

Ejemplos:

$ pbex
pbex: returns name of bundle applications's executable file
usage: pbex [application name]
$ pbex "Microsoft Edge"
Application 'Microsoft Edge' not found
$ pbex Finder
/System/Library/CoreServices/Finder.app/MacOS/Finder
$ pbex "Quick Look Simulator.app"
/System/Library/Frameworks/Quartz.framework/Versions/A/Frameworks/QuickLookUI.framework/Versions/A/Resources/Quick Look Simulator.app/MacOS/Quick Look Simulator
$ pbex "BalTax 2016"
/Applications/BalTax 2016/BalTax 2016.app/MacOS/JavaApplicationStub
$ pbex ColorSync\ Utility
/Applications/Utilities/ColorSync Utility.app/MacOS/ColorSync Utility

INFORMACIÓN DE FONDO

La estructura de un macOS paquete de paquete de la aplicación es bien conocido y documentado por parte de Apple.

De acuerdo a La Estructura de un macOS Paquete de la Aplicación, la estructura básica de una aplicación de Mac es:

MyApp.app/
   Contents/
      Info.plist
      MacOS/
      Resources/ 

donde la MacOS carpeta "contiene la aplicación independiente de código ejecutable. Normalmente, este directorio contiene sólo un archivo binario con su aplicación principal punto de entrada y vinculado estáticamente código. Sin embargo, puede poner a otros ejecutables independientes (tales como herramientas de línea de comandos) en este directorio también."

El Info.plist archivo es necesario para el Buscador de reconocer un paquete de la aplicación como tal. Esta información de la lista de propiedades filecontains propiedad XML de la lista de datos que identifica la configuración de su paquete. La clave que es de interés para nosotros es CFBundleExecutable, que las tiendas de "el nombre del archivo ejecutable principal. Este es el código que se ejecuta cuando el usuario inicia la aplicación."

5voto

yoliho Puntos 340

No es exactamente un único comando, pero me puede dar los pasos para obtener la información. Esta información es de Apple del Paquete guía de Programación.

Usted necesita saber la estructura de una Aplicación.

En su directorio root es el directorio de Contenido. En ese directorio hay un directorio de MacOS que contiene la aplicación independiente de código ejecutable y un archivo de Información.plist

Info.plist es un plist formato de archivo que contiene información acerca de la aplicación, incluyendo el nombre del archivo ejecutable principal. Este nombre es el valor correspondiente a la clave CFBundleExecutable.

Así, el algorithim para encontrar las aplicaciones de partida es ejecutable

  1. Encontrar la aplicación
  2. Encontrar el directorio de Contenido de la aplicación
  3. Lea la Información.plist archivo obteniendo el valor de CFBundleExecutable
  4. el ejecutable está en el MacOs directorio de 2 y el nombre es el resultado de 3.

Nota: los pasos 1 y 3 no son triviales y requieren de llamadas a Apple del sistema de bibliotecas

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X