Wie erstelle ich eine Mac OS X .app mit einem Shell-Skript?

Ich habe versucht, ein paar Tutorials zu befolgen, aber ich bekomme Folgendes:PowerPC-Fehler

Wie kann ich das beheben? Ich habe eine info.plist hinzugefügt (ich habe gerade die Datei einer anderen App kopiert und eingefügt und ein paar Dinge geändert.)

Außerdem habe ich chmod +x myAppdas Skript ausführbar gemacht.

PS Ich benutze El Capitan

Wir können nicht erraten, was Sie getan haben, bevor Sie die Fehlermeldung erhalten haben. Welche Tutorials hast du befolgt, nach welchem ​​Schritt bist du hängen geblieben?
Ich habe einen Ordner namens myApp.app erstellt, dann einen Unterordner namens Contents, dann MacOS, dann ein myApp-Shell-Skript, das #!/bin/bash ; say "Hi" ; exit 0(mit jedem der Befehle in verschiedenen Zeilen und ohne Semikolon) enthält.
Ein Bash-Skript, bei dem das Ausführungsbit gesetzt ist, muss nicht unbedingt in einem Bundle platziert werden, um ausgeführt zu werden. Doppelklicken Sie einfach darauf, wenn Sie sich nur im Finder befinden, oder führen Sie es vom Terminal aus aus. Wenn Sie wirklich ein Anwendungspaket wünschen, erstellen Sie es mit AppleScript oder Automator, wobei letzteres einfach ist. Fügen Sie eine Shell-Skript ausführen-Aktion hinzu und platzieren Sie Ihren Code darin.
@ user3439894 Ich habe den Automater in der von Ihnen beschriebenen Methode ausprobiert, bevor Sie dies gepostet haben, aber die App wurde nicht auf dem Zielcomputer ausgeführt.
@ user3439894 Nun, aus irgendeinem Grund kann ich meinen vorherigen Kommentar nicht bearbeiten. Der Fehler lautete etwa „Dieser Anwendungstyp wird auf diesem Computer nicht unterstützt“.
Ist der Zielcomputer derjenige, auf dem die Automator-App erstellt wurde, und wenn nicht, warum können Sie sie nicht einfach auf dem Zielcomputer erstellen? Warum muss es ein Anwendungspaket sein, warum kann das Skript nicht einfach wie im ersten Satz meines ersten Kommentars erwähnt ausgeführt werden?
@user3439894 Ich habe keinen Zugriff auf den Zielcomputer, da es meine Freunde sind. Außerdem muss es beim Start geöffnet werden.
Welche Version von OS X befindet sich auf dem Zielcomputer?
@ user3439894 Yosemite oder El Capitan ... nicht sicher, welche.

Antworten (4)

Nun, es ist Jahre her, dass ich diesen einfachen Trick verwende, um Bash-Skripte in der Anwendung zu haben (und verstehe wirklich nicht, warum alle Leute so komplizierte Lösungen wie das Erstellen von "Contents" -Ordnern, info.plist oder die Verwendung von Automator oder Platypus oder so versuchen.. . ????).

  1. Erstellen Sie einen Ordner mit dem Namen "YourApplication.app". Es kann an jedem Ort erstellt werden, der für Ihre Verwendung geeignet ist. Die mit dem Betriebssystem am besten kompatiblen Speicherorte können jedoch /Applications oder Ihr eigener ~/Applications-Ordner sein.
  2. Legen Sie Ihre Skriptdatei direkt in diesem Ordner ab, so wie es Ihnen am besten passt (Finder, Terminal usw.). Das Skript muss natürlich ausführbar sein (ggf. chmod +x verwenden). Keine Notwendigkeit für andere Ordner oder Dateien (bis Sie natürlich andere Skripte oder ausführbare Dateien innerhalb Ihres Skripts aufrufen müssen) Der Trick besteht darin, Ihr Skript mit genau demselben Namen wie den Anwendungsordner zu benennen, jedoch ohne Erweiterung. In dem hier beschriebenen Fall muss die Skriptdatei „YourApplication“ heißen.

Das ist alles ! Es funktioniert auf Mac OS X seit Snow Leopard bis Mavericks. Wenn jemand neuere Betriebssystemversionen ausprobieren und mir sagen kann.

Hinweis: Das Skript muss mindestens 28 Bytes groß sein, sonst wird es nicht ausgeführt. Es kann mit Leerzeilen aufgefüllt werden, um eine Mindestgröße zu erreichen. Außerdem muss die erste Zeile des Skripts ein Kram sein; zB #!/bin/bashoder #!/bin/perl.

[AKTUALISIEREN]

Als Antwort auf den Kommentar von @DenisHowe können Sie bei Verwendung dieses Tricks diese Zeilen am Anfang des Skripts hinzufügen, wenn Sie den Pfad der aktuellen Ausführung haben möchten:

abspath () 
{ 
case "${1}" in 
    [./]*)
    local ABSPATH="$(cd ${1%/*}; pwd)/"
    echo "${ABSPATH/\/\///}"
    ;;
    *)
    echo "${PWD}/"
    ;;
esac
}


CURRENTPATH=`abspath ${0}`
PATH=$PATH:$CURRENTPATH
Versuchen Sie, weitere Zeilen hinzuzufügen, es gibt Ihnen die Meldung, die Sie hatten, wenn Ihr Skript nicht genügend Zeilen enthält.
Ich habe Ihre Antwort so bearbeitet, dass sie die entscheidende fehlende Information enthält, und sie positiv bewertet.
OK, danke für die Korrektur und das Upvoting ... Ich benutze das schon zu lange und habe vergessen, dass 28 Bytes benötigt werden ... Ich habe natürlich kein so kleines Skript: D
Ich habe das gerade unter macOS Sierra getestet und es funktioniert auch dort.
OK Cool. Beifall
Wow! Das funktioniert! Kann es nicht glauben. Ich danke dir sehr. Bearbeiten: Getestet auf macOS Sierra
Nun, ich konnte nicht glauben, dass noch niemand diese so einfache Lösung ausprobiert hat ... Ich bin froh, dass es bei Ihnen funktioniert hat.
Stellen Sie für jeden, der dies versucht, sicher, dass die erste Zeile ist#!/bin/bash
@FlareCat Tatsächlich habe ich gerade nachgesehen und ich denke, jeder Shebang mit einem vorhandenen Interpreter wird ausreichen (versucht mit Perl). Wenn Sie andere Sprachen ausprobiert haben, sagen Sie es einfach ;).
Weiß jemand, wie man das Skript dazu bringt, das Arbeitsverzeichnis in den .app-Ordner zu ändern?
@bugloaf Habe meine Antwort gefunden: stackoverflow.com/a/246128/214070
Um ihm ein benutzerdefiniertes Symbol zuzuweisen, rufen Sie Informationen auf, wählen Sie das Symbol oben links aus und fügen Sie dann ein 512 x 512-Bild ein.
@bugloaf: Meistens verwende ich diesen Skript-Trick, um andere Anwendungen in einem Prozess zu "kapseln" (Laufwerke zu mounten, Geräte, Agenten, Deamons zu verwalten oder Synchronisierungen durchzuführen, bevor ich zum Beispiel eine App starte), also verwende ich einfach die ersetzte Anwendung Symbol, indem Sie das Symbol aus dem "Get Info"-Bedienfeld der Quellanwendung, unteres großes Symbol, in das "Get Info"-Bedienfeld der Zielanwendung, oberes linkes, kleines Symbol ziehen (das Pluszeichen sollte erscheinen, wenn sich die Maus über dem kleinen Symbol befindet, und Sie können es einfügen An diesem Punkt).
Für alle, die macOS Mojave verwenden, können Sie dazu das integrierte Automator-Programm verwenden. Verwenden Sie einfach die Aktion Shell-Skript ausführen und speichern Sie sie dann als App
Was ist, wenn sudozum Ausführen des Skripts erforderlich ist? Was kann ich tun, damit das Skript den Benutzer nach dem Passwort fragt?
@Royi Nun, es hängt stark vom Zweck und dem Befehl ab, den Sie als Root ausführen müssen. Sie können eine Anwendung aufrufen (open -a ...), die die Administrator-Eskalation verwaltet, oder Sie können die Datei /etc/sudoers verwenden und dem Anrufer/Benutzer die erforderlichen Rechte für die Anwendung/den Befehl hinzufügen (meistens Ihre Mac-OS-ID /Benutzer). Hüten Sie sich jedoch vor Sicherheitsbedenken, das Brechen von Sudo-Rechten ist nicht immer eine gute Möglichkeit, Dinge zu tun. Suchen Sie über Google nach "mac os sudoers", Sie werden wahrscheinlich viele Beispiele finden (es gibt auch einige in der Datei).
@Steve Vermeulen: Dies ist in der Tat eine andere Lösung, obwohl sie bereits in anderen Antworten vorgeschlagen wurde und nicht spezifisch für Mojave ist. Das ist eine alte Funktion in mac Os Automator. Obwohl dies für meinen Sinn nicht so einfach und elegant ist. Es ist nur erforderlich, wenn Sie unter bestimmten Umständen Parameter übergeben müssen (ich denke zum Beispiel an Lightroom Export Actions).
Ich würde spezifizieren, dass das YourApplication.appcerated in sein muss/Applications
@Igor Fobia, ich weiß nicht, welche Betriebssystemversion Sie verwenden, aber dieser Trick funktioniert von jedem Ort aus, nicht nur von /Applications, zumindest unter Mac Os High Sierra und früheren Versionen.
Funktioniert auch unter macOS Catalina, danke
Dies scheint immer noch mit Big Sur zu funktionieren. Das Übergeben von Argumenten (z. B. zu öffnende Datei) funktioniert bei mir jedoch nicht. Dies scheint nur mit Automator-Anwendungen zu funktionieren
@basbebe Danke für deinen Bericht. Ich kann Big Sur im Moment nicht haben, um nach einer Lösung für die Argumente zu suchen (meine beiden Macs sind zu alt). Aber ich werde es so schnell wie möglich versuchen. Ich denke, ein Blick in die Dokumentation von "open" mit --args kann weitere Hinweise geben.
Öffnen mit --argsfunktioniert. aber z. B. das Öffnen eines Dokuments mit der erstellten Anwendung gibt einen Fehler im Terminalfenster: Unknown command: \Xca\Xfe\Xba\Xbe(Ich bekomme diesen Fehler auch, wenn ich nur den Dateispeicherort an den Befehl anhänge)
@basbebe in der Tat, aber ich bin mir dann nicht sicher, ob es spezifisch für Big Sur ist. Um ehrlich zu sein, verwende ich diesen Skript-Anwendungstrick nicht, wenn ich die Funktion "Drag-and-Drop-Dokument" benötige, ich verwende stattdessen Automator (manchmal mit einer Kombination).
Ich finde es toll, wie das Anwenden Ihrer Skripts sie beim Klicken sofort ausführen lässt und ihnen eine prominentere Position in Spotlight verleiht.
Wenn Ihr Skript als Anwendung ausgeführt wird, hat es wahrscheinlich nicht die gleiche Umgebung wie bei der Ausführung von einer interaktiven Shell. Beispielsweise müssen Sie möglicherweise den PATH festlegen oder absolute Pfade von Befehlen angeben.
@DenisHowe In der Tat. Hier ist ein Beispiel dafür, was ich normalerweise am Anfang der Skripte hinzufüge: abspath () { case "${1}" in [./]*) local ABSPATH="$(cd ${1%/*}); pwd )/" echo "${ABSPATH/\/\///}" ;; *) echo "${PWD}/" ;; esac } CURRENTPATH= abspath ${0}PATH=$PATH:$CURRENTPATH:
Ist es mit dieser Lösung möglich, das Terminal zu zeigen und um Eingaben zu bitten? Ich habe es geschafft, das Skript im *.app-Ordner auszuführen, möchte aber einige Werte drucken und einige Tastatureingaben vornehmen.
@ user62013 An diesem Punkt verwende ich Cocoadialog für das, was mit Macports installiert werden kann (ich fürchte, es ist noch nicht sehr gut dokumentiert, da es ein ziemlich totes Projekt ist, aber es funktioniert immer noch). Sie können Applescript auch für einfache Dialogfelder und Eingaben verwenden. Andererseits ist es meiner Meinung nach nicht sehr interessant, die Lösung, die ich hier gegeben habe (ich meine das Skript in der einfachen App), zu verwenden, um am Ende das Terminal zu verwenden. Ich denke, Sie sollten besser direkt ein Skript mit Terminal starten, indem Sie darauf doppelklicken, und es dann standardmäßig verwenden.
Das Erstellen einer App auf diese Weise erlaubte mir nicht, eine pkg-Datei zu erstellen. Ist das etwas, das eine kompliziertere Struktur erfordert?
@ ngood97 Können Sie genauer sagen, was Sie mit "pkg-Datei erstellen" meinen (Prozess, verwendete Software, Zweck)?
@PierreLagarde Ja, auf jeden Fall! Der Prozess, dem ich folgen wollte, ist hier: techrepublic.com/article/… -> sudo pkgbuild –install-location /Applications –component /Volumes/Google\ Chrome/Google\ Chrome.app ./Desktop/Google\ Chrome.pkg Aus irgendeinem Grund mag das pkgbuild-Tool diese Struktur nicht und gibt diesen Fehler aus: pkgbuild: error: Path “<path x>/TestApplication.app" is not a valid bundle component (using destination path “<path x>”)Es ist nicht zu wichtig, ich möchte nur ein minimales Paket, um Dinge damit zu testen.
Tatsächlich konnte ich mithilfe dieser Anleitung ein minimales Paket erstellen: matthew-brett.github.io/docosx/flat_packages.html , falls jemand danach sucht
@ngood97 ok gut, und danke für dein Feedback. Ich muss sagen, dass ich diesen Trick nur egoistisch auf meinen eigenen Macs angewendet habe. Da es einfach ist, den Bash-Text einfach auf jeden anderen Mac zu bringen, und die App einfach in einem einfachen DIY-Prozess erstellt werden kann, frage ich mich nie, wie man ein Paket für die Lieferung erstellt. Das ist sicher eine interessante Ergänzung.
Wie kann ich es im Dock anzeigen lassen?
@TSR Ziehen Sie es wie jede andere Anwendung in das Dock.

Die derzeit akzeptierte Antwort funktioniert bei mir nicht ganz. Ich erhalte das kleine kaputte Anwendungssymbol.

Geben Sie hier die Bildbeschreibung ein

Folgendes funktioniert bei mir unter OSX 10.15.7 (Catalina). YourApplicationSie können in allen folgenden Anweisungen den Namen ändern , den Sie wirklich möchten.

  1. mkdir ein Verzeichnis mit der .appErweiterung im /ApplicationsOrdner mit einem Contentsund dann MacOSUnterverzeichnissen.

    mkdir -p /Applications/YourApplication.app/Contents/MacOS
    
  2. Verschieben Sie Ihr Skript in dieses Verzeichnis und benennen Sie es genauso wie den obersten Anwendungsordner, jedoch ohne die .appErweiterung und ohne die Shell-Skripterweiterung:

    mv yourscript.sh /Applications/YourApplication.app/Contents/MacOS/YourApplication
    
  3. Stellen Sie sicher, dass Ihr Skript ausführbar ist:

    chmod +x /Applications/YourApplication.app/Contents/MacOS/YourApplication
    

Hier ist eine Beispielanwendung zum Ausprobieren:

#!/bin/sh
result=`osascript -e 'display dialog "Should I beep?" buttons {"Yes", "No"}'`
if [[ "$result" = "button returned:Yes" ]]; then
    osascript -e 'beep'
fi

Ihre Anwendung sollte jetzt bereit sein und das Skript sollte ausgeführt werden, wenn Sie darauf doppelklicken. Beachten Sie unbedingt, dass Sie beim Umbenennen der Anwendung auch das zugrunde liegende Skript umbenennen müssen.


Dass Ihre Anwendung von LaunchPad gesehen wurde, war schwieriger herauszufinden. Folgendes schien zu funktionieren. Sie müssen der /Applications/YourApplication.app/Contents/Info.plistDatei etwas wie das Folgende hinzufügen. Möglicherweise müssen Sie es auch in eine DMG-Datei und zurück zu Anwendungen für LaunchPad verschieben, um es zu bemerken. Siehe: https://stackoverflow.com/a/71342335/179850

<?xml version="1.0" encoding="UTF-8" standalone="no"?><plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>My App</string>
    <key>CFBundleGetInfoString</key>
    <string>My App 1.0</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
</dict>
</plist>

Um Ihrer neuen Anwendung ein Symbol hinzuzufügen, müssen Sie Folgendes tun:

  1. Suchen oder erstellen Sie ein PNG, das Ihr Symbol sein soll.

  2. Öffnen Sie das Bild in der Vorschau-Anwendung – andere Grafik-Apps funktionieren möglicherweise auch.

  3. Drücken Sie Befehl-a, um alles auszuwählen, und dann Befehl-c, um es in die Zwischenablage zu kopieren.

  4. Wählen Sie Ihre Anwendung im Finder aus und drücken Sie Befehlstaste-i, um das Fenster „Informationen“ aufzurufen.

  5. Klicken Sie auf das Symbol in der oberen linken Ecke des Infofensters, um es auszuwählen:

    Geben Sie hier die Bildbeschreibung ein

  6. Fügen Sie das Bild aus der Zwischenablage ein, das das Symbol ändern soll.

    Geben Sie hier die Bildbeschreibung ein

Sie können auch das Get Info-Fenster in einer anderen Anwendung öffnen, das Symbol auswählen und es kopieren, um es in Ihre neue Anwendung einzufügen. Nachdem Sie ein beliebiges Symbol zugewiesen haben, .appsollten Sie in Ihrem Verzeichnis einen Dateinamen sehen, der mit beginnt Icon.

Sie müssen nicht alle diese Ordner in der Anwendung haben. Legen Sie Ihr Skript einfach direkt in den Stammordner der Anwendung (dh /Applications/YourApplication.app in Ihrem Fall) und machen Sie es ausführbar. Es muss nur mindestens 28 Bytes groß sein und einen Shebang haben, wie es jedes Skript haben sollte.
Das ist alles sehr gut und es funktioniert wie beschrieben, aber nichts davon macht es für Launcher sichtbar, was der Hauptgrund ist, warum ich mein Skript überhaupt in eine "App" umwandeln möchte. Jeder kann das letzte bisschen liefern?
Was ist Launcher @q.undertow? Meinst du LaunchPad? Vielleicht Anweisungen von hier zum Ziehen Ihrer neuen Anwendung auf das LaunchPad-Symbol? appletoolbox.com/…
Ja, Launchpad, tut mir leid. Ich werde diesen Link versuchen, aber ich möchte mich nicht mit dem Systembereich /Applications herumschlagen - ich habe mein Skript unter ~/Applications. Ich hatte dort einige heruntergeladene Apps und ich erinnere mich, dass Launchpad damit kein Problem hatte.
Ich habe einige zusätzliche Anweisungen @q.undertow hinzugefügt. Meine Anwendung wird jetzt im Launchpad angezeigt. Sehen Sie, ob es für Sie funktioniert.
@all Sorry für die späte Antwort, aber ich wurde nicht über deine Fragen informiert, da sie in einem anderen Thread waren. Sie können die Datei info.plist einfach direkt im Ordner YourApplication.app hinzufügen. Keine Notwendigkeit für Unterordner, wie bereits für das Skript gesagt. Auf diese Weise wird es wie jede andere Anwendung in der Launchpad-Liste angezeigt. Ich benutze das immer noch in Monterey. Ich kann helfen, wenn bei dir etwas schief läuft, notiere mich einfach hier :D. Die einzige Einschränkung besteht darin, Argumente zu übergeben. Dafür müssen Sie stattdessen eine Automator-Anwendung erstellen.

Wenn es sich um ein einfaches Shell-Skript handelt, müssen Sie es nicht in ein Anwendungspaket packen; Sie können auf das Skript selbst doppelklicken. Sie haben jedoch nicht die Möglichkeit, ein benutzerdefiniertes Symbol oder ähnliches zu haben.

Ich denke, es gibt ein paar Helfer da draußen, die einfache Skripte umschließen können, aber das einzige, mit dem ich Erfahrung habe, ist Platypus , mit dem Sie Shell-/Python-/Perl-/Ruby-/etc-Skripte wie normale Anwendungen mit Symbolen ausführen können, ich/ O Umleitungen usw.

Platypus unterscheidet sich hier darin, dass Sie STDIN / STDOUT über einige verschiedene Mechanismen sowie über die Interaktivität der Menüleiste abrufen können. Sie erhalten also ein Fenster, in dem Sie mit dem gerade ausgeführten Skript interagieren können.

Platypus scheint von der Befehlszeile aus nicht verwendbar zu sein (wo sich wahrscheinlich Ihr Shell-Skript befindet).

Dieses Skript https://github.com/andrewp-as-is/mac-appify , das mit pip für Python-Benutzer ( ) installiert werden kann, scheint die Schritte in der obigen Antwortpip install mac-appify auszuführen .

Es kann so nützlich sein

pip install mac-appify
appify script.sh  /Applications/$NAME.app