Wie führe ich ein Shell-Skript in OS X durch Doppelklick aus?

233

Ich habe ein Shell-Skript mit Benutzerausführungsberechtigung unter OS X, aber wenn ich darauf doppelklicke, wird es in einem Texteditor geöffnet. Wie kann ich es durch Doppelklicken zum Laufen bringen?

c2h2
quelle

Antworten:

266
  • Machen Sie das Skript zuerst im Terminal ausführbar, indem Sie Folgendes eingeben:

    chmod a+x (yourscriptname)
  • Klicken Sie dann im Finder mit der rechten Maustaste auf Ihre Datei und wählen Sie "Öffnen mit" und dann "Andere ...".

  • Hier wählen Sie die Anwendung aus, in der die Datei ausgeführt werden soll. In diesem Fall handelt es sich um Terminal. Um ein Terminal auswählen zu können, müssen Sie von "Empfohlene Anwendungen" zu "Alle Anwendungen" wechseln. (Die Anwendung Terminal.app befindet sich im Ordner Dienstprogramme.)

  • HINWEIS: Wenn Sie nicht alle Dateien mit dieser Erweiterung verknüpfen möchten, die im Terminal ausgeführt werden soll, sollte "Immer geöffnet mit" nicht aktiviert sein.

  • Nachdem Sie auf OK geklickt haben, sollten Sie in der Lage sein, Ihr Skript durch einfaches Doppelklicken auszuführen.
Lus
quelle
danke ich habe es bekommen, ich wusste nicht, mit Terminal zu verbinden, ich dachte, mit / bin / sh
c2h2
22
Ich konnte Terminal.app nicht in der Liste finden, bis mir klar wurde, dass ich im Ordner "Dienstprogramme" nachsehen musste. Hoffentlich spart dies jemandem etwas Zeit.
Glenn Lawrence
27
Auf OSX 10.8 und höher, ein ausführbares Skript , deren Namen hat entweder kein Suffix oder Suffix .commandist standardmäßig ausführbare Datei aus dem Finder, ohne die Notwendigkeit Finder instruieren , wie sie zu öffnen.
mklement0
1
"Alle Anwendungen" ist die Einstellung, die mir gefehlt hat ... wahrscheinlich auch das, was Cheruvim erlebt hat. Zu Glenns Kommentar: Sie können einfach die integrierte Suchfunktion in der oberen rechten Ecke des Fensters verwenden. Stellen Sie sicher, dass Sie den vollständigen Namen der App eingeben, z. B. Terminal.app.
Elder Elder
3
Nicht der saubere Weg, es zu tun. Benennen Sie Ihr Skript in die .commandDateierweiterung um.
Bachsau
227

Haben Sie versucht, die .commandDateinamenerweiterung zu verwenden?

Hagelin
quelle
3
Das ist besser. In der @ Lus-Antwort ist der Arbeitsordner nicht derselbe, in dem Sie das Skript öffnen.
Rodrigo
6
Gibt es eine Möglichkeit, "Hintergrund" -Aufgaben ohne Konsolenfenster zu starten?
Lapo
6
Bitte beachten Sie, dass das aktuelle Verzeichnis möglicherweise nicht das ist, in dem sich Ihr Skript befindet. Sehen Sie sich diese Frage an, um sie zu korrigieren
Pavel Alexeev
14
Sie benötigen noch eine Ausführungsberechtigung ( chmod +x), aber die .commandErweiterung ist bereits mit Terminal verknüpft. Tolle Lösung, danke
NorTicUs
Anscheinend kann der Benutzer mit dieser Methode nicht mit dem Terminalprogramm interagieren - es sei denn, ich irre mich?
Demis
153

Ab OSX 10.10 (Yosemite) und seit mindestens OS X 10.8 (Mountain Lion) ist das Verhalten wie folgt, wenn Sie ausführbare Skripts im Finder öffnen (doppelklicken) :

  • Ausführbare Skripte [1] mit entweder NO-Suffix oder Suffix.command :
    • werden ausgeführt standardmäßig - keine Einrichtung erforderlich :
      • Ein neues Terminalfenster wird geöffnet, in dem das Skript ausgeführt wird.
      • Standardmäßig bleibt das Fenster nach dem Beenden des Skripts geöffnet , sodass Sie die Ausgabe überprüfen können (obwohl zu diesem Zeitpunkt die Shell, in der das Skript ausgeführt wurde, beendet wurde und Sie nicht mehr mit ihr interagieren können ).
        Über Terminals Preferences... > Profileskönnen Sie jedoch festlegen, dass das Fenster beim Beenden des Skripts automatisch geschlossen wird .
    • Caveat : Der Arbeitsordner ist immer die des aktuellen Benutzers Home - Ordner , NICHT der Ordner , in dem sich das Skript befindet.
      • Platzieren Sie ein Shell-Skript in dem Ordner, in dem es sich befindet
        • cd -- "$(dirname "$BASH_SOURCE")" gleich nach der shebang linie
        • oder, wenn Sie POSIX-konform bleiben müssen , cd -- "$(dirname "$0")".
        • Informationen zu Randfällen , z. B. zum Auffinden des wahren Quellverzeichnisses eines Symlink- Skripts, finden Sie in meiner Antwort .
    • Wenn das Skript unerwartet nicht ausführbar ist :
      • Machen Sie es ausführbar, indem Sie es chmod +x <script>im Terminal ausführen . Andernfalls treten die folgenden Symptome auf:
      • .command: Finder zeigt eine irreführende Fehlermeldung an, die darauf hinweist, dass das Problem über behoben werden kann File > Get Info, was nicht der Fall ist. Verwenden Sie die chmod +xoben vorgeschlagene Methode.
      • kein Suffix:
        • mit einer Shebang-Linie (zB #!/bin/bash): Verhalten ist wie das Suffix .sh- siehe unten.
        • mit keiner Shebang - Zeile: öffnet sich in Ihrem Standard - Texteditor (das TextEdit Standardeinstellung).
  • Skripte mit Suffix.sh , ob ausführbar oder nicht:
    • werden zur Bearbeitung in TextEdit.appoder, falls installiert, mit geöffnetXcode.app .
  • Skripte mit Suffix.scpt oder .applescript(auch wenn sie selbst als ausführbar gekennzeichnet sind, was normalerweise nicht der Fall ist):
    • zum Bearbeiten in geöffnet[Apple]Script Editor
    • Beachten Sie, dass die JXA -Quellcodedateien (noch) kein eindeutiges Suffix zu haben scheinen.
  • Skripte mit einem benutzerdefinierten Suffix (ein dem System noch nicht bekanntes Suffix), ob ausführbar oder nicht (gilt tatsächlich für jede Art von Datei):
    • Fordern Sie die App auf, sie beim ersten Öffnen zu öffnen , und merken Sie sich diese Auswahl .

[1] Ausführbar bedeutet: Ein Skript mit gesetzten ausführbaren Berechtigungsbits und dem aufrufenden Benutzer - relativ zum Besitz der Datei - darf es daher möglicherweise ausführen.
Wenn Sie chmod a+xsetzen alle Berechtigungs - Bits (was typisch ist), jeder kann rufen Sie es (vorausgesetzt , sie sind auch erlaubt lesen Sie die Datei auf der Basis Lese Berechtigungs - Bit (n) und das Eigentum des Datei).

mklement0
quelle
1
Es ist möglich, das geöffnete Terminalfenster zu schließen, wenn das Skript mit einem einfachen Fenster beendet wird, das osascriptSie in die .commandDatei aufnehmen können, anstatt manuell mit dem Profil herumzuspielen.
l'L'l
@ I'L'I: Meinst du damit, einen osascript -e '...'Befehl am Ende eines Skripts hinzuzufügen ? Was ist der spezifische Befehl und stellt er sicher, dass die rechte Registerkarte geschlossen ist, auch wenn das Skript nicht auf der vordersten Registerkarte ausgeführt wird?
mklement0
5
@ mklement0: Ja, ich habe es nicht länger als ein paar Minuten getestet, aber die Grundidee ist, in die letzte Zeile des .command- Skripts aufzunehmen: osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Es funktioniert möglicherweise nicht in jedem Szenario, obwohl die Umleitung bei der Ende ist wirklich der Schlüssel - das Osascript kann ansonsten einfach angepasst werden (z. B. muss das Fenster möglicherweise in eine Registerkarte geändert werden, wenn dies das Standardverhalten Ihres Terminals ist usw.).
l'L'l
Ist es möglich, das Terminalfenster / die Registerkarte .commandtrotz Ausführung des Profils trotz der Profileinstellung nicht schließen zu lassen ?
CyberMew
@CyberMew: Wenn Sie das Skript ändern können, fügen Sie einen Befehl hinzu, der am Ende auf einen Tastendruck wartet. Wenn es sich beispielsweise um ein bashSkript handelt, fügen Sie es read -p 'Press Return to close this window.'als letzte Anweisung hinzu.
mklement0
38

Alternativ können Sie mit Platypus eine normale Mac OS X-Anwendung aus Ihrem Skript erstellen

svth
quelle
Dies ist eine wirklich tolle App. Aber ich habe hier ein Problem. Ich habe ein Python-Skript, das ich in eine .app-Datei konvertieren möchte. Mein Skript enthält eine Zeile, in die der Benutzer eine Eingabe eingeben muss (raw_input ()). Wenn die .app diese Codezeile erreicht, wird ein EOF-Fehler (Dateiende) ausgegeben. Was kann ich tun?
1
Es ist kein interaktives Terminal. Platypus präsentiert lediglich die Skriptausgabe. Es gibt keine bidirektionale Kommunikation.
18.
4
Oder erstellen Sie eine OS X-Anwendung mit Automator mithilfe der Aktion "Shell-Skript ausführen".
Rangi Keen
15

Der einfache Weg ist, die Erweiterung in .commandoder keine Erweiterung zu ändern .

Aber das öffnet das Terminal und Sie müssen es schließen. Wenn Sie keine Ausgabe sehen möchten, können Sie mit Automator eine Mac-Anwendung erstellen, die Sie doppelklicken, zum Dock hinzufügen usw. können.

  1. AutomatorAnwendung öffnen
  2. Wählen Sie den Typ "Anwendung"
  3. Geben Sie "Ausführen" in das Suchfeld "Aktionen" ein
  4. Doppelklicken Sie auf "Shell-Skript ausführen".
  5. Klicken Sie auf die RunSchaltfläche in der oberen rechten Ecke, um es zu testen.
  6. File > Save um die Anwendung zu erstellen.

Geben Sie hier die Bildbeschreibung ein

wisbucky
quelle
Toll ! Wie können wir diesen Workflow so automatisieren, dass er täglich um 13 Uhr ausgeführt wird?
iAkshay
9

Sie müssen keine Apps von Drittanbietern wie Platypus verwenden.

Erstellen Sie einfach ein Apple-Skript mit dem Skript-Editor und verwenden Sie den Befehl do shell script "shell commands"für direkte Befehlsaufrufe oder ausführbare Shell-Skriptdateien. Bewahren Sie die bearbeitbare Skriptdatei irgendwo auf und exportieren Sie sie, um ein Anwendungsskript zu erstellen. Das App-Skript kann durch Doppelklick oder Auswahl im Balkenordner gestartet werden.

Luc-Olivier
quelle
3
Verwenden Sie Automator und verwenden Sie die Aktion "Shell-Skript ausführen" direkt, anstatt Apple Script zu verwenden.
Rangi Keen
0

Sie können mit RCDefaultApp auch Standardeinstellungen nach Dateierweiterung festlegen:

http://www.rubicode.com/Software/RCDefaultApp/

Möglicherweise könnten Sie .sh so einstellen, dass es in iTerm / Terminal usw. geöffnet wird. Es würde Benutzerausführungsberechtigungen erfordern, z

chmod u+x filename.sh

RCDefaultApp-Voreinstellungsbereich

Tomachi
quelle
0

chmod 774 filename

Hinweis : Die Datei mit dem Namen 'Dateiname', die das Bash-Skript enthält, hat keine Erweiterung

Neo
quelle