Finalmente lo conseguí: Agrega esto a tu .bash_profile
function foomagick() {
rm -f ~/.foomagick.tmp
ls /Applications/ | grep "\.app" | grep -v iWork | while read APP; do
# limpiarlo
a=`echo $APP | sed s/\ //g`;
a=`echo $a | sed s/\'//g`;
echo alias ${a%.*}="'open -a \"${APP%.*}\"'" >> ~/.foomagick.tmp
done
source ~/.foomagick.tmp
rm ~/.foomagick.tmp
}
foomagick()
Ahora lo siguiente funciona:
Skim # abrir Skim.app
Skim foo.pdf
FireFox http://google.com
FireFox google.com # ERROR. Busca archivo local.
Editado por Reid:
Implementé lo anterior como un script de Python que crea scripts envoltorios en lugar de alias. Necesitarás poner ~/bin/mankoffmagic
en tu ruta. Si quieres que los envoltorios se actualicen automáticamente, ejecútalo regularmente desde cron u otro método.
#!/usr/bin/python
#
# Este script actualiza automáticamente un conjunto de scripts de shell envolventes en
# ~/bin/mankoffmagic que llama a aplicaciones de Mac instaladas en /Applications.
#
# Inspirado en el alias de shell de mankoff publicado en apple.stackexchange.com; vea:
# http://apple.stackexchange.com/questions/4240/concisely-starting-mac-os-apps-from-the-command-line/4257#4257
#
# Notas/Errores:
#
# 1. No sigue enlaces simbólicos (¿alias?)
#
# 2. Supone que los nombres de aplicaciones no contienen comillas dobles.
#
# 3. No es muy inteligente para encontrar el binario real (hace una suposición). Esto es
# incorrecto a veces, por ejemplo, Firefox. Probablemente una comprensión más profunda de la estructura del paquete de la aplicación
# solucionaría esto.
import copy
import glob
import os
import os.path
import re
BINDIR = os.path.expandvars("$HOME/bin/mankoffmagic")
APP_RE = re.compile(r'(.*)\.app$')
STRIP_RE = re.compile(r'[\W_]+')
def main():
# Eliminamos agresivamente todo lo que ya está en BINDIR, para evitar el problema
# de analizar lo que debería quedarse
for f in glob.glob("%s/*" % BINDIR):
os.unlink(f)
# Recorre /Applications y crea un script de shell envolvente para cada directorio .app
for (root, dirs, files) in os.walk("/Applications"):
dirs_real = copy.copy(dirs) # para poder manipular dirs mientras se recorre
for d in dirs_real:
#print "checking %s" % os.path.join(root, d)
m = APP_RE.search(d)
if (m is not None):
#print "Found " + m.group()
dirs.remove(d) # no es necesario reaccionar en la app
create_script(root, d, m.group(1))
def create_script(path, appdir, appname):
# eliminar no alfanuméricos y pasarlo a minúsculas
wrapper = STRIP_RE.sub('', appname).lower()
wrapper = os.path.join(BINDIR, wrapper)
fp = open(wrapper, "w")
# Ajustar los comentarios en el script dependiendo de si quieres
# invocar el binario o usar "open" -- el primero te permite usar cualquier
# argumento de línea de comandos, mientras que el segundo es más al estilo de Mac (la app se pone al frente, etc.)
fp.write("""
#!/bin/sh
exec "%s/%s/Contents/MacOS/%s" "$@"
#open -a "%s" "$@"
""" % (path, appdir, appname, appname))
fp.close()
os.chmod(wrapper, 0700)
if (__name__ == "__main__"):
main()