Ich versuche, ein paar Tastaturkürzel einzurichten, mit denen bestimmte iTerm-Sitzungen geöffnet werden können, die ich mit BetterTouchTool und ein bisschen AppleScript-Magie ausführen konnte. Das Problem ist, dass OS X darauf besteht, ein Terminal-Fenster für jedes Shell-Skript zu öffnen, das Sie über die GUI ausführen (z. B. über Finder oder als Tastenkürzel von BetterTouchTool). Das Terminalfenster wird nicht angezeigt, wenn ich das Skript direkt von einem anderen Terminal aus starte.
Eine Problemumgehung bestand darin, das Skript in ein .app-Verzeichnis zu packen, wodurch das Problem des überflüssigen Terminalfensters behoben wird, aber einige andere Probleme auftreten (z. B. scheint OS X jedes resultierende iTerm-Fenster als separate App zu behandeln und mein Dock zu überfrachten ). (BEARBEITEN: Dieses Verhalten wurde tatsächlich durch einen Fehler in meinem Skript verursacht, siehe unten)
Ich habe auch versucht, die Terminal-App einem anderen virtuellen Desktop in den Spaces-Einstellungen zuzuweisen, um sie außer Sichtweite zu bringen. Dann wird sie jedoch erst auf diesen Desktop umgeschaltet, bevor das Skript ausgeführt wird.
Gibt es eine Möglichkeit, dieses Verhalten vollständig zu deaktivieren? Ich habe bereits die Einstellung in den Terminal-Einstellungen gefunden, um das Fenster zu schließen, nachdem das Skript beendet wurde, aber es ist immer noch ärgerlich, wenn das Terminal-Fenster für eine Sekunde angezeigt wird.
quelle
Antworten:
Öffnen Sie Automator , wählen Sie " Anwendung" , fügen Sie eine Aktion " Shell-Skript ausführen" hinzu und fügen Sie Ihren Shell-Befehl in Anführungszeichen ein (wenn Sie eine Datei haben, können Sie sie einfach per Drag & Drop verschieben).
Jetzt können Sie es nicht mehr abspielen, sondern überall als App speichern und sogar das Symbol festlegen .
quelle
&
und dann ein AppleScript aufrief, um die App (in meinem Fallmplayer
) nach vorne zu bringen:mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
mplayer
, um ein Video aus einer Diashow (in Skim) abzuspielen. Es gibt einen Fehler, bei dem der Player im Hintergrund bleibt, wenn Skim auf Vollbild eingestellt ist. Ich bin mir jedoch nicht sicher, ob dieser Fehler nur mit Skim oder allen Vollbild-Apps zusammenhängt. Daher habe ich mir vorgenommen, meine Lösung hier zu veröffentlichen.Hier ist ein schnelles und schmutziges Beispiel ohne großen Aufwand (für eine App namens "myapp"):
Erstellen Sie eine partielle Anwendungshierarchie:
Stellen Sie sicher, dass die erste Zeile Ihres Skripts den vollständigen Pfad zum gewünschten Programm enthält, z.
Nennen Sie Ihr Shell-Skript "myapp" (keine Anführungszeichen, keine Erweiterung), geben Sie ihm Ausführungsberechtigungen und legen Sie es dann im MacOS-Unterverzeichnis ab. So erteilen Sie ihm Ausführungsberechtigungen:
Wechseln Sie in das Inhaltsverzeichnis und erstellen Sie eine PkgInfo-Datei mit der Zeichenfolge: APPL ???? [kein Zeilenendezeichen am Ende der Zeichenfolge!] Verwenden Sie das Dienstprogramm cat (1), um die Datei zu erstellen:
Nachdem Sie den String eingegeben haben (drücken Sie nicht die Eingabetaste!), Geben Sie zwei Strg-Ds ein, um
die Datei ohne Zeilenabschluss zu schließen und zur Shell-Eingabeaufforderung zurückzukehren.
Doppelklicken Sie im Finder auf Ihre neue "App". Es wird ohne Fenster ausgeführt.
quelle
Vielleicht möchten Sie Platypus ausprobieren , das Mac OS X-Anwendungen aus Shellskripten und anderen interpretierten Skripten erstellt.
quelle
Hier ist eine kleine Problemumgehung, falls Sie Lust auf Anwendungsstarter wie Alfred haben . Ich benutze es jeden Tag und habe mir das Powerpack gekauft , mit dem Sie Silent-Shell-Skripte ausführen können .
Diese öffnen beim Ausführen kein Terminal und können an eine beliebige Schlüsselwortsequenz gebunden werden. Sie können sogar Parameter enthalten und zusätzliche Optionen haben:
Ich benutze dies für einige kleine Schnipsel und es ist sehr flexibel.
quelle
Wenn Sie einen Schlüssel hinzufügen
LSUIElement
und1
inInfo.plist
Ihrer App festlegen , wird im Dock kein Symbol erstellt.Hier ist
Info.plist
meine kleine Shell-Skript-App:quelle
touch
das Bundle zu installieren, um sicherzustellen, dass die neueste Version verwendet wurde.do shell script "say 'arsti'"
wird das Terminalfenster nicht geöffnet.pgrep
und dann den entsprechenden Code direkt an weiterleitetosascript
(der AppleScript-Interpreter). Das Problem ist, dasspgrep
es von Homebrew stammt und nicht in der Standardeinstellung enthalten ist$PATH
. Daher hat mein Skript immer eine neue iTerm-Instanz gestartet, auch wenn sie bereits ausgeführt wurde. Nach dem Hinzufügen des vollständigen Pfads zumpgrep
Skript scheint der Bundle-Ansatz doch noch in Ordnung zu sein, daher denke ich, dass ich jetzt glücklich binCFBundleExecutable
und entferntCFBundleIconFile
), funktioniert dies perfekt.Hier ist ein Workaround:
Kompilieren Sie ein AppleScript, das ein Shell-Skript aufruft :)
Das
osacompile
wird das'do shell script "XXX"'
Applescript-Snippet kompilieren . Ihr Shell-Skript ist das XXX.Achten Sie beim Zitieren darauf, dass das Shell-Skript korrekt zitiert wird, damit die Shell, mit der Sie es kompilieren, noch intakt ist.
Dies kann jedoch von BetterTouchTool aus ohne Umstände ausgeführt werden.
quelle
Es gibt noch ein anderes mögliches Training. Sichern Sie Ihr Shell-Skript in einem Automator-Workflow. Rufen Sie den Workflow mit launchd auf. Der Code lautet:
Dies startet kein Programm und wird auch nicht in der Menüleiste angezeigt und ist daher leiser als eine Platypus-App.
Ein noch besserer Weg, Shell-Skripte auszuführen, ist direkt in launchd.
Führt den Befehl im Hintergrund aus.
quelle