Können Finder und der Befehl „Öffnen“ Dateien mit .sh oder anderen typischen Erweiterungen wie .command-Dateien behandeln?

Ich suche nach einer Möglichkeit, weitere Erweiterungen systematisch in die Datenbank der OS X-Startdienste einzufügen, damit sie beim Klicken in der Terminal-App ausgeführt werden, genau wie standardmäßig .command-Dateien.

Dinge wie .ksh, .sh, und .cshwären nett zu beginnen, aber ich nehme an, sobald ich herausgefunden habe, wie man eins hinzufügt, ist es einfach, den Rest zu erledigen.

Eine Antwort speziell für Lion oder Snow Leopard ist in Ordnung, daher ist eine allgemeine Antwort für alle Betriebssystemversionen nicht erforderlich. Es wäre großartig, wenn dies skriptfähig wäre und direkt in die Launch Services-Datenbank geschrieben würde, damit ich dies automatisieren könnte, anstatt auf jedem Mac zum Finder zu gehen und viel zu klicken.

Ich muss wahrscheinlich in die Entwicklerdokumentation graben, um herauszufinden, was und wie mit UTI umgegangen wird, um dies richtig zu machen. developer.apple.com/library/ios/#DOCUMENTATION/FileManagement/…
Die Suche nach RCDefaultApp führte mich zu dieser Antwort apple.stackexchange.com/questions/9866/… aber irgendwo anders sah ich kürzlich RCDefaultApp erwähnt, nicht weit von Magic Launch … verstanden: wahrscheinlich nicht so nützlich wie der erste Link, apple.stackexchange.com /q/13557/8546
In einer verknüpften Frage macht ein Kommentar auf duti aufmerksam . Soll das hier eine Antwort sein? Oder möchten Sie bei dieser Frage lieber nur mit dem arbeiten, was in OS X integriert ist ?

Antworten (2)

Wenn eine Datei mit Terminal geöffnet wird und das Ausführungsbit gesetzt ist, führt Terminal sie aus.

Holen Sie sich Informationen zu einer .sh-Datei und legen Sie fest, dass sie mit Terminal geöffnet werden soll, und klicken Sie auf die Schaltfläche Alle ändern.

Als ich die .sh-Datei ausführbar machte, beanspruchte eine andere App sie auf meinem Mac. Gehen Sie zum Finder, rufen Sie Informationen ab, klicken Sie mit der rechten Maustaste, ignorieren Sie die Warnung, dass Terminal möglicherweise nicht in der Lage ist, .sh zu öffnen, funktioniert. Technisch ist dies sicherlich machbar – aber ich lasse die Antwort für etwas offen, das programmgesteuert direkt in die Launch Services-Datenbank schreibt, anstatt über die Benutzeroberfläche.

Terminal zum Öffnen von .sh-Dateien bevorzugen – mit dem Standardbefehl, ohne den Finder zu verwenden

In den meisten Fällen sollte alles Erforderliche von der Kommandozeile aus möglich sein …

Vorbereitung

Zwei Befehle:

defaults read com.apple.LaunchServices | grep -B 1 -A 3 public.shell-script

defaults read com.apple.LaunchServices | grep -B 1 -A 4 "LSHandlerContentTag = sh;"

Wenn einer der beiden Befehle eine vorhandene Präferenz aufdeckt

Verwenden Sie Xcode oder einen anderen geeigneten Eigenschaftslisten-Editor, um das relevante Wörterbuch aus dem LSHandlersSchlüssel in der folgenden Datei zu entfernen:

~/Library/Preferences/com.apple.LaunchServices.plist

Hinweise:


Hinzufügen zu den LaunchServices-Einstellungen, damit Terminal .sh-Dateien anzeigen und bearbeiten kann

Zwei einzeilige Befehle.

Je nach Ihren Anforderungen kann der erste Befehl allein ausreichen:

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "public.shell-script"; LSHandlerRoleViewer = "com.apple.Terminal"; LSHandlerRoleEditor = "com.apple.Terminal"; }'

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentTag = "sh"; LSHandlerContentTagClass = "public.filename-extension"; LSHandlerRoleViewer = "com.apple.Terminal"; LSHandlerRoleEditor = "com.apple.Terminal"; }'

Damit die neuen Präferenzen respektiert werden

Änderungen an der Benutzerdomänen-Persistenzschicht von Launch Services müssen bestätigt werden . Am wenigsten störend für den Endbenutzer sind dabei:

  • einen Neustart des Betriebssystems.

Über die Befehlszeile, wenn ein sofortiger Neustart akzeptabel ist:

sudo shutdown -r now


Hintergrund

Grundlegendes zur Terminal.app-Unterstützung für .sh (public.shell-script)

Betrachten Sie das Ergebnis des folgenden Befehls:

defaults read /Applications/Utilities/Terminal.app/Contents/Info

Terminal für einen Moment beiseite: Es ist manchmal unangemessen (oder einfach wertlos), das Öffnen eines Dokumenttyps durch eine App zu erzwingen, die diesen Typ nicht unterstützt.

Für Terminal stelle ich mir keinen Schaden im Umgang mit dem public.shell-scriptTyp vor.

@Lri In zwei oder mehr Tests funktionierte Terminal wie erwartet mit einem einfachen !sh-Einzeiler – nach dem Lauf von lsregistercomplete. Aber (wie Sie unter der anderen Frage anmerken) ist die Verwendung lsregisterauf diese Weise nicht ohne Ärger. Ich werde etwas an Ask Different Chat posten, um Sie darauf aufmerksam zu machen.
Ich hatte wirklich gehofft, @Lri hätte weise Worte. Ich habe nach Details gefragt, und Graham – Sie sind sehr detailverliebt. Ich kann Ihre Antwort (vielleicht noch) nicht in die Praxis umsetzen, aber ich schätze die zusätzlichen Augäpfel und Vorschläge dazu sehr.
Danke ! – Erwarten Sie, dass die Grauzone dieser Antwort zu gegebener Zeit aufgeräumt wird.