Nie można otworzyć prostej aplikacji skryptowej na mac

0

Mac OS X 10.6

Stworzyłem bardzo prostą aplikację, która jest tylko opakowaniem skryptu powłoki (dzięki czemu mogę wybrać ten skrypt w selektorach aplikacji, takich jak aplikacje startowe). Próbuję go uruchomić i wczoraj zadziałało, ale dzisiaj zmieniłem zawartość i nazwę skryptu wykonywalnego (z czymś, co perfekcyjnie działa w skrypcie powłoki uruchomionym w Terminalu) i wyświetli tylko okno dialogowe z ikoną Findera

Nie można otworzyć aplikacji, ponieważ nie jest ona obsługiwana na tego rodzaju komputerach Mac.

Przywróciłem poprzedni skrypt (content / name), ale nadal pojawia się błąd! Tak samo przy ponownym wiązaniu aplikacji od podstaw lub całkowitej zmianie identyfikatora pakietu…

Jeśli spróbuję go otworzyć w Terminalu za pomocą open My.app, Dostaję

Aplikacji nie można otworzyć, ponieważ ma nieprawidłowy format wykonywalny.

Ale kiedy wykonuję bezpośrednio Contents/MacOS/Script, zawsze działa (z obiema treściami). Ponadto jest wyświetlany z poprawną ikoną i meta-informacjami w Finderze (więc chyba Info.plist jest zrozumiały).

Drzewo plików aplikacji to:

Contents/
    Info.plist
    MacOS/
        Script    (executable bit set, works when launched directly)
    PkgInfo
    Resources/
        AppIcon.icns

Tutaj jest Info.plist zawartość:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>Script</string>
    <key>CFBundleIconFile</key>
    <string>AppIcon</string>
    <key>CFBundleIdentifier</key>
    <string>asdf.ScriptApp</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>My script</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.4</string>
</dict>
</plist>

I PkgInfo plik zawiera tylko APPL????. Testowałem skrypt za pomocą prostego echo "ok" i echo "ok" >/tmp/test (plus #!/bin/sh nagłówek).

Moje pytania to:

  • Czy istnieje jakiś rodzaj buforowania ważności dla aplikacji? oparty na czym ? jak go spłukać?
  • Skąd pochodzi ta wiadomość? Próbowałem google, ale wszystko, co dostaję, to strona mówiąca o 32/64 bitach Java…
instanceof me
źródło

Odpowiedzi:

6

To jest dość nekro, ale nie mogę znaleźć kolejnego trafienia w google, gdzie zostało to zadane i na które odpowiedziałem. W końcu się zorientowałem (teraz 10.7):

Plik skryptu powłoki musi zaczynać się od „#!” a oto najdziwniejsza część: musi mieć co najmniej 28 znaków.

Jeśli umieścisz 27 skryptów postaci i dotkniesz paczki, ikona zmieni się w aplikację z linią przechodzącą przez nią. Dodaj jeden znak do skryptu i dotknij go ponownie, a BOOM, to działa.

Dziwne, nie?

Peter Jerde
źródło
To najbardziej absurdalna rzecz, jaką kiedykolwiek słyszałem, ale jest to całkowicie prawdziwe. 27 znaków, nie będzie działać. 28 znaków, BAM! To działa.
Schrockwell
1

Możesz utworzyć aplikację wykonującą skrypt w Automatorze za pomocą jednego Uruchom skrypt powłoki akcja.

Daniel Beck
źródło
tak, wiem, ale chcę zrozumieć, dlaczego to nie działa
instanceof me
1
@streetpc Właśnie stworzyłem pakiet aplikacji od podstaw. Pracowałem przy pierwszej próbie. Przeniosłem go do innego folderu iz powrotem przed rozpoczęciem aktualizacji usług uruchamiania. Mój plik skryptu: #!/usr/bin/env bash | cd /Users/danielbeck | touch fooo z | będący ogranicznikiem linii. chmod +x Script i to wszystko. fooo zostaje utworzony podczas wykonywania.
Daniel Beck
0

Sam skrypt powłoki może być zły. Zwykle dzieje się to między platformami PPC / Intel lub odwrotnie.

Josh K
źródło
Jak określono, skrypt powłoki działa poprawnie po uruchomieniu bezpośrednio przez Terminal przez My.app/Contents/MacOS/Script.
instanceof me
Miałem na myśli opakowanie. Czy został stworzony ze starszą wersją / inną architekturą?
Josh K
opakowanie zostało utworzone ręcznie
instanceof me
0

Możesz sprawdzić Platypus:

http://sveinbjorn.org/platypus

„Platypus to narzędzie programistyczne dla systemu operacyjnego Mac OS X. Może być używane do tworzenia rodzimych, bezbłędnie zintegrowanych aplikacji Mac OS X z interpretowanych skryptów, takich jak skrypty powłoki lub programy Perl, Ruby i Python. Robi się to poprzez zawijanie skryptu w strukturze katalogów pakietu aplikacji wraz z wykonywalnym plikiem binarnym, który uruchamia skrypt. ”

svth
źródło
Dziękuję za odpowiedź. Zastanawiałem się, dlaczego nie byłem w stanie uruchomić mojego skryptu (bez powiadomienia), więc użycie innego narzędzia nie wchodzi w zakres tego pytania, ale to narzędzie wydaje się miłe.
instanceof me
0

Z powodzeniem zbudowałem aplikacje, których pliki wykonywalne są skryptami powłoki. Jednak zawsze poszli dalej exec normalny proces GUI (lub nietypowy, taki jak program Java); być może to robi różnicę.

Czy kontrolowałeś także różnice w zmiennych środowiskowych? Po uruchomieniu z Terminalu otrzymujesz efekt plików kropek ( .profile, .bash_profile, .bashrcitd.), ale uruchamianie GUI nie używa żadnego z nich. (To środowisko można zmodyfikować za pomocą ~/.MacOSX/environment.plist (po ponownym wprowadzeniu zmian), jeśli chcesz to zrobić.)

Kevin Reid
źródło