Wie kann man .app dekomprimieren und ausführen?

Ich versuche, eine komprimierte AppleScript .app auszuführen.

unzip -p file.app.zip | open -

oder

open < $(unzip -p file.app.zip)

Ist das möglich?

Hast Du es versucht ? was geschieht
Es druckt nur die openHilfeoptionen
Was aufmachen ? Wo ? unzip erstellt einen neuen Ordner (mit dem gleichen Namen wie der Zip-Ordner)
Es ist ein kleines Shell-Skript, das ich geschrieben habe. Zugegeben, die Verwendung einer Pfeife erschwert dies. Aber ich wüsste gerne wie man das macht. Die -pOption mit unzip druckt den Inhalt über stdout
Lassen Sie mich Ihnen einige Punkte für den Versuch geben
Es gibt einen Grund, warum Apps auf.dmg verteilt werden. Sie können die komprimierte Festplatte bereitstellen und die App ausführen. Andere Unix-Mauten behandeln die App nicht als eine Sache, sondern als eine Menge separater Dateien und Verzeichnisse
@Buscar웃, Sie sagten: "... Unzip erstellt einen neuen Ordner (mit demselben Namen wie der Zip-Ordner)", das stimmt nicht mit der-p im OP verwendeten Optionunzip -p ... , z . Aus der unzip Manpage : " -p extract files to pipe (stdout)."

Antworten (2)

Da Sie es mit einer zip-komprimierten Anwendung .app zu tun haben , bei der es sich um ein Anwendungspaket mit vielen Dateien handelt, müssen Sie die Anwendung meiner Meinung nach zuerst auf die Festplatte extrahieren, um sie zu öffnen, da der open Befehl zum Öffnen einer Anwendung die Form von hat open -a ...und nimmt keine Eingabe von stdout.

Im Folgenden wird davon ausgegangen, dass der App-Name in oder der genaue Name der App in der Datei file.app.zipist :file.zip

unzip -oq "file.app.zip" -d /tmp; open -a "/tmp/file.app"; sleep 1; rm -r "/tmp/file.app"

Die obige zusammengesetzte Befehlszeile extrahiert die file.app.zipto /tmpund öffnet sie dann, wartet eine Sekunde und löscht dann die /tmp/file.app. Beachten Sie, dass der Wert des sleep Befehls möglicherweise angepasst werden muss, damit die App nicht gelöscht wird, bevor sie geöffnet und beendet wurde.

Beachten Sie, dass der Inhalt von /tmp, das eigentlich /private/tmp, beim Neustart automatisch gelöscht wird. Die zusammengesetzte Befehlszeile könnte also verkürzt werden, wenn es Ihnen egal ist, ob die App /tmp'bis zum nächsten Neustart aktiv bleibt:

unzip -oq "file.app.zip" -d /tmp; open -a "/tmp/file.app"
Würde das Ersetzen ;durch &&eine zusätzliche Ebene der Fehlerbehandlung hinzufügen? Mein Verständnis ist, dass &&sichergestellt wird, dass der nächste Befehl nur ausgeführt wird, wenn der vorherige ohne Fehler beendet wurde.

Sie fordern den openBefehl zum Öffnen von Inhalten von stdin. openkann zum Lesen gemacht werden, stdinaber es öffnet den Inhalt in einem Texteditor - was nicht das ist, was Sie wollen.

Versuchen Sie es osascriptdirekt: Wenn es sich bei der gezippten Datei einfach um AppleScript handelt, erreichen Sie dies folgendermaßen.

unzip -p file.zip | osascript - 

Aus der osascriptManpage:

osascript sucht das Skript an einer der folgenden drei Stellen:

  1. Wird zeilenweise mit -e-Schaltern in der Befehlszeile angegeben.

  2. Enthalten in der Datei, die durch den ersten Dateinamen in der Befehlszeile angegeben wird. Diese Datei kann einfacher Text oder ein kompiliertes Skript sein.

  3. Wird mit der Standardeingabe übergeben. Dies funktioniert nur, wenn keine Dateinamensargumente vorhanden sind; Um Argumente an ein STDIN-Leseskript zu übergeben, müssen Sie explizit '-' für den Skriptnamen angeben.

Hast du tatsächlich getestet, ob das, was du gepostet hast, funktioniert? Ich frage, weil es in meinen Tests Fehler macht.
Natürlich. Der Befehl geht davon aus, dass es sich bei der entpackten Datei um Klartext-AppleScript-Befehle handelt.
@ user3439894, siehe meinen vorherigen Kommentar. Diese Lösung funktioniert für einfaches altes AppleScript. Ihre Antwort ist angesichts einer AppleScript-Anwendung angemessener.
@ephsmith, danke für die Antwort, aber das sind auch Fehler für mich mit: 0:1: syntax error: A unknown token can't go here. (-2740). Meine Test-ZIP-Datei enthält ein AppleScript mit folgendem Inhalt:do shell script "touch /Users/$USER/Desktop/test"