Können Finder und der Befehl "Öffnen" Dateien mit .sh oder anderen typischen Erweiterungen wie Befehlsdateien behandeln?


7

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

Dinge wie .ksh, .shund .cshwäre schön zu beginnen, aber ich gehe davon aus, dass es einfach ist, den Rest zu erledigen, sobald ich herausgefunden habe, wie man eines hinzufügt.

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 nach Finder zu suchen und viel zu klicken.


Ich werde wahrscheinlich in den Entwicklungsdokumenten stöbern müssen, um herauszufinden, was und wie UTI behandelt werden, um dies richtig zu machen. developer.apple.com/library/ios/#DOCUMENTATION/FileManagement/…
bmike

Die Suche nach RCDefaultApp führte mich zu dieser Antwort apple.stackexchange.com/questions/9866/… , aber kürzlich sah ich irgendwo anders, dass RCDefaultApp nicht weit von Magic Launch erwähnt wurde … verstanden: wahrscheinlich nicht so nützlich wie der erste Link, apple.stackexchange.com / q / 13557/8546
Graham Perrin

In einer verknüpften Frage macht ein Kommentar auf duti aufmerksam . Sollte das hier eine Antwort sein? Oder möchten Sie bei dieser Frage lieber nur mit dem arbeiten, was in OS X integriert ist ?
Graham Perrin

Antworten:


3

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

Rufen Sie Informationen zu einer .sh-Datei ab, stellen Sie ein, dass sie mit Terminal geöffnet werden soll, und klicken Sie auf die Schaltfläche Alle ändern.


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

3

Bevorzuziehen, dass Terminal .sh-Dateien öffnet - mit dem Standardbefehl, ohne Finder zu verwenden

In den meisten Fällen sollte alles, was erforderlich ist, über die Befehlszeile 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 Befehle eine vorhandene Präferenz anzeigt

Verwenden Sie Xcode oder einen anderen geeigneten Eigenschaftenlisten-Editor, um das entsprechende 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.

Abhängig von 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 Persistenzschicht der Benutzerdomäne von Launch Services müssen bestätigt werden . Dies ist für den Endbenutzer am wenigsten störend:

  • ein Neustart des Betriebssystems.

Wenn ein sofortiger Neustart über die Befehlszeile 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 ohne Unterstützung für diesen Typ entwickelt wurde.

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



@Lri In zwei oder mehr Tests arbeitete Terminal wie erwartet mit einem einfachen! Sh-Einzeiler - nach Abschluss des Laufs lsregister. Aber (wie Sie unter der anderen Frage bemerken) ist die Verwendung lsregisterauf diese Weise nicht ohne Ärger. Ich werde etwas posten, um Different Chat um Ihre Aufmerksamkeit zu bitten.
Graham Perrin

1
Ich hatte wirklich gehofft, @Lri hätte Worte der Weisheit. Ich habe nach Details gefragt und Graham - Sie sind sehr detailreich. Ich kann Ihre Antwort (noch vielleicht) nicht in die Praxis umsetzen, aber ich schätze die zusätzlichen Augäpfel und Vorschläge, die diesbezüglich bisher gemacht wurden, sehr.
bmike

Danke ! - Erwarten Sie, dass die Grauzone dieser Antwort zu gegebener Zeit aufgeräumt wird.
Graham Perrin

-1

Die Unix-Methode besteht darin, Terminal.app zu öffnen und die Skripte auf ausführbar zu setzen chmod +x scriptname.sh.

Sie können auch einen Link von / bin / bash zu / Applications erstellen und / Applications / bash als Standardanwendung für .sh-Dateien im Dialogfeld "Informationen" definieren. Aber das scheint meiner Meinung nach irgendwie komisch zu sein.


Die ausführbaren Dateien werden von einer anderen App beansprucht. Ich schätze, ich muss die Datenbank direkt massieren und überwachen, wenn andere Apps wie diese UTI - developer.apple.com/library/ios/#DOCUMENTATION/FileManagement/…
bmike
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.