Ausführen von Shell-Skripten über das OS X-Dock?

160

Wie richte ich ein Shell-Skript ein, das vom Mac OSX-Dock ausgeführt werden soll? Es scheint, dass durch einfaches Erstellen einer Verknüpfung die Datei in meinem Editor geöffnet wird. Gibt es ein Flag, das ich irgendwo setzen muss, damit es ausgeführt wird, anstatt es zur Bearbeitung zu öffnen?

Wilco
quelle
2
sollte +1 nur für den Avatar sein, obwohl mir das Thema auch gefällt.
Matt Bannert
Vielleicht möchten Sie die akzeptierten Antworten auf die zweite @ Wilco umstellen. Ich denke, es ist eine bessere Antwort.
Gray

Antworten:

189

Sie können einen Automator-Workflow mit einem einzigen Schritt erstellen: "Shell-Skript ausführen".

Dann File > Save As, und das Dateiformat ändern zu „Anwendung“. Wenn Sie die Anwendung öffnen, wird der Shell-Skript-Schritt ausgeführt, der Befehl ausgeführt und nach Abschluss beendet.

Der Vorteil hierbei ist , es ist wirklich einfach zu tun , und Sie können sehr leicht von Benutzereingaben ( zum Beispiel der Auswahl einer Reihe von Dateien), dann gibt sie an den Eingang des Shell - Skript (entweder auf stdin, oder als Argumente) erhalten.

(Automator ist in Ihrem /ApplicationsOrdner!)

Beispiel für einen Workflow

dbr
quelle
6
@dbr, GUI Button Drücker! :) Nur ein Scherz, das ist ein guter Vorschlag!
Willasaywhat
Ja, es war ein ausgezeichneter Vorschlag :) Ich habe sogar Automator-Aktionen für einige meiner Apps geschrieben und vergesse es in Zeiten wie diesen immer noch :)
Jason Coco
Ich kann dies nicht mit nohup zum Laufen bringen, a la "nohup / usr / bin / myscript &; disown -a && exit 0". Ich benötige die App / den Workflow, um ein Skript auszuführen und sofort zu beenden. Irgendwelche Ideen? :-)
Hourback
3
@martineau Wenn Sie die Anwendung öffnen open -a SomeAppThing.app --args --etc=2, sollte sie sich konzentrieren. Alternativ können Sie es mit Applescript (zB osascript -e 'tell application "Google Chrome" to activate') fokussieren
dbr
1
Hinweis: Wenn Ihr Skript eine GUI-App startet, die noch eine Weile geöffnet bleibt, wird in der Taskleiste ein sich ständig drehendes Zahnradsymbol angezeigt, bis die App geschlossen wird. Eine Problemumgehung besteht darin, der Startzeile des Skripts "&> / dev / null &" hinzuzufügen, damit Automator nicht wartet.
Ewall
49

Wenn Sie kein Terminalfenster benötigen, können Sie jede ausführbare Datei zu einer Anwendung machen, indem Sie einfach ein Shell-Skript erstellen Exampleund in den Dateinamen verschieben Example.app/Contents/MacOS/Example. Sie können diese neue Anwendung wie jede andere in Ihrem Dock platzieren und mit einem Klick ausführen.

HINWEIS: Der Name der App muss genau mit dem Skriptnamen übereinstimmen. Das Verzeichnis der obersten Ebene muss also sein Example.appund das Skript im Contents/MacOSUnterverzeichnis muss benannt sein Exampleund das Skript muss ausführbar sein.

Wenn das Terminalfenster angezeigt werden muss, habe ich keine einfache Lösung. Sie könnten wahrscheinlich etwas mit Applescript machen, aber das ist nicht sehr sauber.

Jeremy Banks
quelle
1
Sie wissen nicht zufällig, ob es eine einfache Möglichkeit gibt, Dateien als Argumente an das Shell-Skript zu übergeben? Für Dateien, die mit "Öffnen mit ..." geöffnet wurden.
Fuzzy76
9
Für alle, die dies versuchen, muss der Name der App genau mit dem Skriptnamen übereinstimmen. So muss es wirklich sein example.sh.app, nicht nur example.app. Sie erhalten eine Warnung über beschädigte App, wenn diese nicht übereinstimmen
Kip
1
Zur Verdeutlichung - ich bin ein OSX-Neuling - möchten Sie einfach eine Ordnerstruktur wie die in Ihrem Beispiel gezeigte erstellen, in der die Skriptdatei wie gezeigt abgelegt ist.
Martineau
2
@martineau Ja, das ist richtig. Wenn Sie einen Ordner erstellen, dessen Name auf .appund mit dieser Struktur endet , wird er als ausführbare Anwendung behandelt. Wenn Sie den Inhalt dieses Ordners im Finder anzeigen möchten, müssen Sie mit der rechten Maustaste darauf klicken und "Paketinhalt anzeigen" auswählen (da ein Doppelklick darauf die Anwendung ausführen würde). Im Terminal scheint es sich nur um einen Ordner zu handeln. (Ich bin nicht sicher, ob Sie mit Finder den Ordner selbst in .app umbenennen können. Möglicherweise müssen Sie die Umbenennung im Terminal vornehmen.)
Jeremy Banks
1
Ich habe es gerade versucht und in El Capitan (10.11) den Fehler erhalten: "Sie können nicht öffnen ... weil PowerPC-Anwendungen nicht mehr unterstützt werden." : D Das ist ziemlich interessant!
AllenH
26

Unter OSX Mavericks:

  1. Erstellen Sie Ihr Shell-Skript.
  2. Machen Sie Ihr Shell-Skript ausführbar:

    chmod +x your-shell-script.sh
  3. Benennen Sie Ihr Skript um, um ein .appSuffix zu erhalten:

    mv your-shell-script.sh your-shell-script.app
  4. Ziehen Sie das Skript in das OSX-Dock.
  5. Benennen Sie Ihr Skript wieder in ein .shSuffix um:

    mv your-shell-script.app your-shell-script.sh
  6. Klicken Sie mit der rechten Maustaste auf die Datei im Finder und klicken Sie auf die Option "Informationen abrufen".
  7. Stellen Sie am unteren Rand des Fensters das Shell-Skript so ein, dass es mit dem Terminal geöffnet wird.

Wenn Sie nun im Dock auf das Skript klicken, wird ein Terminalfenster geöffnet, in dem Sie Ihr Skript ausführen können.

Bonus: Um das Terminal nach Abschluss Ihres Skripts zu schließen, fügen Sie exit 0am Ende hinzu und ändern Sie die Terminaleinstellungen so, dass "die Shell geschlossen wird, wenn sie sauber beendet wird", wie in dieser SO-Antwort angegeben .

stiemannkj1
quelle
Schön, das hat bei mir funktioniert, auf jeden Fall die Ikone, die ich mich frage, zufällig. Zu Ihrer Information: Auch Schritt 7 bezieht sich auf die Datei und nicht auf den Menüpunkt ...
Mike Q
übrigens schön! nur alle .sh mit offenem terminal.
iHTCboy
@ stiemannkj1, Zeigt dies das Symbol, während die App ausgeführt wird? Gibt es sowieso etwas zu verbergen?
Pacerier
@ Pacerier, sorry, ich bin nicht mehr unter OSX (auf Linux umgestellt :)). Vielleicht möchten Sie die Antwort von Jeremy Bank ausprobieren . Ich habe keine anderen Ideen und da ich kein OSX habe, kann ich nichts testen oder
herumspielen
17

Ich weiß, dass dies alt ist, aber falls es für andere hilfreich ist:

Wenn Sie ein Skript ausführen müssen und möchten, dass das Terminal angezeigt wird, damit Sie die Ergebnisse sehen können, die Sie wie in Abyss Knight angegeben ausführen können, und die Erweiterung in .command ändern können. Wenn Sie darauf doppelklicken, wird ein Terminalfenster geöffnet und ausgeführt.

Ich brauchte dies jedoch, um von Automator oder AppleScript ausgeführt zu werden. Damit dies ein neues Terminal öffnet, war der Befehl, den ich über "Shell-Skript ausführen" ausführte, "myShellScript.command öffnen" und wurde in einem neuen Terminal geöffnet.

Jason Tholstrup
quelle
wunderbar, danke! Jetzt müssen alle, die es zu einer perfekten Lösung machen möchten, das Terminalfenster schließen, wenn das Skript abgeschlossen ist.
Peter M
1
Wenn in den Terminaleinstellungen das Fenster zum Schließen geschlossen ist, können Sie den Befehl exit zu Ihrem Skript hinzufügen, und Sie haben das, was Sie wollen.
Jason Tholstrup
7

Solange Ihr Skript ausführbar ist und keine Erweiterung hat, können Sie es unverändert auf die rechte Seite (Dokumentseite) des Docks ziehen. Wenn Sie darauf klicken, wird es in einem Terminalfenster ausgeführt, anstatt einen Editor zu öffnen.

Wenn Sie eine Erweiterung (wie foo.sh) haben möchten, können Sie im Finder zum Dateiinfofenster die Standardanwendung für dieses bestimmte Skript ändern (TextEdit, TextMate, unabhängig davon, für welche Standardeinstellung auf Ihrem Computer festgelegt wurde) .sh-Dateien) an Terminal. Es wird dann einfach ausgeführt, anstatt in einem Texteditor geöffnet zu werden. Auch hier müssen Sie es auf die rechte Seite des Docks ziehen.

Jason Coco
quelle
1
HINWEIS : Dies funktioniert wie ein Champion in OS X 10.10 Yosemite. Ich kann nicht kommentieren 10.9
Bryan Ash
1
Funktioniert am 10.11. Danke dir!
Yassine Imounachen
Funktioniert auch am 10.12! Vielleicht war mein Kommentar zu 10.9 falsch, aber ich habe festgestellt, dass Sie sicherstellen müssen, dass Sie ihn auf den Teil des Docks unter dem Trennzeichen ziehen. Ich habe leider keine Möglichkeit, 10.9 erneut zu testen.
stiemannkj1
Sie müssen es nicht zum Dock hinzufügen. Es kann vom Desktop ausgeführt werden. Es kann aber keine Verlängerung geben. Machen Sie es ausführbar und Sie können einfach doppelklicken. Dies ist die einfachste Option, die ich je gesehen habe.
Rich Apodaca
5

Ich denke, dieser Thread kann hilfreich sein: http://forums.macosxhints.com/archive/index.php/t-70973.html

Um es zu paraphrasieren, können Sie es mit der Erweiterung .command umbenennen oder ein AppleScript erstellen, um die Shell auszuführen.

willasaywhat
quelle
Wenn Sie einem Skript zumindest unter Snow Leopard eine .command-Erweiterung hinzufügen, wird es im Terminal ausgeführt, wenn Sie darauf doppelklicken. Aus irgendeinem Grund können Sie es jedoch immer noch nicht in das Dock ziehen. Die Vorschläge von dbr und Jeremy haben jedoch beide für mich funktioniert.
Jo Liss
5

Wie Joe bereits erwähnt hat, wird dies durch Erstellen des Shell-Skripts und anschließendes Erstellen eines Applescript-Skripts zum Aufrufen des Shell-Skripts erreicht. Dies ist sehr praktisch.

Shell-Skript

  1. Erstellen Sie Ihr Shell-Skript in Ihrem bevorzugten Texteditor, zum Beispiel:

    mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe"

    (Dadurch wird die ausführbare Datei w32 unter Verwendung des Mono-Frameworks ausgeführt.)

  2. Shell-Skript speichern, für mein Beispiel "StartKeepass.sh"

Apple Script

  1. Öffnen Sie den AppleScript-Editor und rufen Sie das Shell-Skript auf

    do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "<enter username here>" password "<Enter password here>" with administrator privileges

    • do shell script - Applescript-Befehl zum Aufrufen externer Shell-Befehle
    • "sh ...." - Dies ist Ihr Shell-Skript (vollständiger Pfad), das in Schritt 1 erstellt wurde (Sie können auch direkte Befehle ausführen. Ich könnte das Shell-Skript weglassen und hier einfach meinen Mono-Befehl ausführen.)
    • user name - erklärt zu Applescript, dass Sie den Befehl als bestimmter Benutzer ausführen möchten
    • "<enter username here> - Ersetzen Sie durch Ihren Benutzernamen (Anführungszeichen) ex "josh"
    • password - erklärt, Ihr Passwort zu appleskriptieren
    • "<enter password here>" - Ersetzen Sie durch Ihr Passwort (Anführungszeichen) ex "mypass"
    • with administrative privileges - erklärt, dass Sie als Administrator ausgeführt werden möchten

Erstellen Sie Ihre .APP

  1. Speichern Sie Ihr Applescript als filename.scpt, in meinem Fall RunKeepass.scpt

  2. Speichern Sie als ... Ihr Applescript und ändern Sie das Dateiformat in Anwendung, was in meinem Fall zu RunKeepass.app führt

  3. Kopieren Sie Ihre App-Datei in Ihren Apps-Ordner

CJoshDoll
quelle
5

Im Skript-Editor:

do shell script "/full/path/to/your/script -with 'all desired args'""

Als Anwendungspaket speichern.

Solange Sie nur die Wirkung des Skripts erzielen möchten, funktioniert dies einwandfrei. Sie werden weder STDOUT noch STDERR sehen.

Joe McMahon
quelle
2
Ich würde vorschlagen: "Als Anwendung speichern BUNDLE". Die Bundles werden viel schneller als Anwendungen gestartet.
e.James
-3

Jemand schrieb ...

Ich habe einfach alle Dateien, die mit ".sh" enden, so eingestellt, dass sie mit Terminal geöffnet werden. Es funktioniert einwandfrei und Sie müssen nicht den Namen jedes Shell-Skripts ändern, das Sie ausführen möchten.

Jonny
quelle