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:
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:
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:
- Búsquedas
/Applications
para el paquete de la aplicación.- 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.- 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.- 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 esCFBundleExecutable
, 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."
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
Nota: los pasos 1 y 3 no son triviales y requieren de llamadas a Apple del sistema de bibliotecas
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.