Frage

Ich mache einen fairen Betrag von Arbeit in der Befehlszeile, und ich finde mich definieren viele Aliase der form:

alias skim='/Applications/Skim.app/Contents/MacOS/Skim'

Gibt es eine Möglichkeit zum hinzufügen von Magie, so dass Fragen zur ausführbaren Datei "foo" verwendet automatisch ausführbaren Datei " /Applications/Foo.app/Contents/MacOS/Foo? Dies ist in OS X 10.6.

(Ich bin mir bewusst, dass ich tun könnte open foo.pdf, aber Überfliegen ist nicht das Standard-PDF-reader, und ich möchte eine Allgemeine Lösung - in einigen Fällen, es ist nicht angemessen, setzen Sie die Anwendung in Frage als Standard-handler für die Datei.)

War es hilfreich?

Lösung

Endlich habe ich es verstanden: Fügen Sie dies Ihrem hinzu .bash_profile

function foomagick() {
    rm -f ~/.foomagick.tmp
    ls /Applications/ | grep "\.app" | grep -v iWork | while read APP; do
        # clean it up                                                           
        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()

Nun die folgende Arbeit:

Skim # open Skim.app
Skim foo.pdf
FireFox http://google.com
FireFox google.com # ERROR. Looks for local file.

Bearbeiten von Reid:

Ich habe das obige als Python -Skript implementiert, das Wrapper -Skripte anstelle von Aliase herstellt. Sie müssen setzen ~/bin/mankoffmagic in deinem Weg. Wenn Sie möchten, dass die Wrapper automatisch aktualisiert werden, führen Sie sie regelmäßig von Cron oder Somessuch aus.

#!/usr/bin/python
#
# This script automagically updates a set of wrapper shell scripts in
# ~/bin/mankoffmagic which call Mac apps installed in /Applications.
#
# Inspired by mankoff's shell alias posted on apple.stackexchange.com; see:
# http://apple.stackexchange.com/questions/4240/concisely-starting-mac-os-apps-from-the-command-line/4257#4257
#
# Notes/Bugs:
#
# 1. Does not follow symlinks (aliases?)
#
# 2. Assumes that application names do not contain double-quotes.
#
# 3. Not very smart about finding the actual binary (it guesses). This is
# wrong sometimes, e.g. Firefox. Probably a deeper understanding of the app
# package structure would fix this.

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():
   # We aggressively delete everything already in BINDIR, to save the trouble
   # of analyzing what should stay
   for f in glob.glob("%s/*" % BINDIR):
      os.unlink(f)

   # Walk /Applications and create a wrapper shell script for each .app dir
   for (root, dirs, files) in os.walk("/Applications"):
      dirs_real = copy.copy(dirs)  # so we can manipulate dirs while looping
      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 need to recurse into app
            create_script(root, d, m.group(1))

def create_script(path, appdir, appname):
   # remove non-alphanumerics and downcase it
   wrapper = STRIP_RE.sub('', appname).lower()
   wrapper = os.path.join(BINDIR, wrapper)
   fp = open(wrapper, "w")
   # Twiddle the comments in the script depending on whether you want to
   # invoke the binary or use "open" -- the former lets you use any
   # command-line args, while the latter is more Mac-like (app puts itself in
   # the front, 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()

Andere Tipps

Sie brauchen nichts Besonderes, Sie haben bereits die Antwort. Versuchen:

open /Applications/Foo.app bar.pdf

auf Bearbeiten

In Anbetracht der Kommentare unten wäre meine Antwort immer noch relativ ähnlich ... Ich würde eine Funktion machen, die offen überschreibt, macht einen Druck auf /Applications, Anrufe /usr/bin/open $appName.app $args, macht ein popd und kehrt zurück.

Ich lutsche an Shell Scripting, aber so etwas wie unten, die spezielle Fälle abdeckt und Sie so ziemlich die gleiche Syntax verwenden, wie Apple für offen bereitgestellt wird. Ich mag es, meine Umgebung so sauber wie möglich zu halten.

Ich bin sicher, die Syntax stammt aus dem Weltraum:

function open($appName, $args)
{
    #if we are calling open without a path like /Applications/TextEdit.app AND
    #    $appName ends in '.app'
    if (!hasParent($appName) && isApp($appName))
    {
        pushd /Applications
        /usr/bin/open ${appName}.app $args &
        popd
        return
    }
    #otherwise, use open as normal
    /usr/bin/open $appName $args
    return
}

auf zweite Bearbeitung

Wenn Sie @Mankoffs Kommentar zur ursprünglichen Frage suchen, wäre die meisten Dinge in der obigen Funktion wahrscheinlich Zeitverschwendung, da Sie nur verwenden könnten open -a $appName. Mankoff hat also wahrscheinlich die einfachste Lösung und sollte seinen Kommentar in eine Antwort ändern;)

Es gibt zwei Lösungen, die ich mir denken kann:

Der einfachere Weg - Mit der Info.plist Datei in jedem .app Contents Verzeichnis, erstellen Sie einen index, der den Wert für den Schlüssel CFBundleExecutable.Dann fügen Sie einen kurzen alias, ruft ein Skript (perl, python, was auch immer) mit dem Namen einer ausführbaren Datei und die Argumente, die Sie gerne zu übergeben.

Der index wäre Paaren von ausführbaren Namen und Pfade zu ausführbaren Dateien.Man müsste schreiben Sie eine wiederkehrende geplante Skript zu halten, aktualisiert.

Sie würde am Ende wird in der Lage zu nennen:

f foo file.txt

wo f ist ein alias ein Skript, das überprüft den index für eine ausführbare Datei namens foo.

Alles in allem, nicht viel Arbeit, um die Funktionalität, die Sie möchten.

Der härtere Weg - Erweitern Sie Ihre shell zu ergänzen, der Bearbeitung seiner command_not_found Fehler.Im wesentlichen würden Sie implementieren ein Ruby-Stil method_missing Funktionalität innerhalb, was shell Sie verwenden.Wenn command_not_found geworfen wurde, Ihre Methode würde überprüfen die ausführbaren Namen des installierten Anwendungen.

Apfelkript zur Rettung:

osascript -e 'tell application "iTunes"' -e "activate" -e 'end tell'

Ersetzen Sie den Namen der Anwendung durch die Anwendung, die Sie starten möchten, und Sie sind fertig. Sie können es natürlich bei Bedarf zu einer Shell -Funktion machen:

function f() {
    osascript <<EOF
tell application "$1"
  activate
end tell
EOF
}

und benutze es so:

f iTunes

Ich hasse AppleScript, aber es ist manchmal nützlich, und ich glaube, die einzige Möglichkeit, eine Anwendung einfach mit Namen in der Befehlszeile anzusprechen. Alles andere erfordert einen vollständigen Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit apple.stackexchange
scroll top