Может ли Finder и команда «открыть» обрабатывать файлы с .sh или другими типичными расширениями так же, как файлы .command?

Я ищу способ систематически вводить еще несколько расширений в базу данных служб запуска OS X, чтобы при нажатии они выполнялись в терминальном приложении так же, как файлы .command по умолчанию.

Было бы неплохо начать с таких вещей, как .ksh, .sh, и , но я полагаю, что как только я выясню, как добавить один, все остальное будет легко сделать..csh

Ответ, специфичный для Lion или Snow Leopard, подходит, поэтому общий ответ для всех версий ОС не требуется. Было бы здорово, если бы это можно было использовать в сценариях и записывать непосредственно в базу данных Launch Services, чтобы я мог автоматизировать это, а не искать на каждом Mac и много щелкать.

Мне, вероятно, придется покопаться в документации разработчиков, чтобы выяснить, что и как обрабатывается UTI, чтобы сделать это правильно. developer.apple.com/library/ios/#DOCUMENTATION/FileManagement/…
Поиск RCDefaultApp привел меня к этому ответу apple.stackexchange.com/questions/9866/… но где-то еще недавно я видел упоминание RCDefaultApp недалеко от Magic Launch … понял: вероятно, не так полезен, как первая ссылка, apple.stackexchange.com /q/13557/8546
В связанном вопросе комментарий обращает внимание на duti . Это должен быть ответ здесь? Или для этого вопроса вы предпочтете работать только с тем, что является неотъемлемой частью OS X ?

Ответы (2)

Если файл открыт с помощью Терминала и у него установлен бит выполнения, то Терминал выполнит его.

Получите информацию о файле .sh и установите его для открытия с помощью терминала, а затем нажмите кнопку «Изменить все».

Когда я сделал исполняемый файл .sh, другое приложение потребовало его на моем Mac. Перейдите к поисковику, получите информацию, щелкните правой кнопкой мыши, игнорируйте предупреждение о том, что терминал не может открыть .sh, он работает. Технически это, безусловно, выполнимо, но я оставлю ответ открытым для чего-то, что напрямую записывает в базу данных Launch Services программно, а не через пользовательский интерфейс.

Чтобы Терминал открывал файлы .sh — с помощью команды по умолчанию, без использования Finder

В большинстве случаев все, что требуется, должно быть возможно из командной строки…

Подготовка

Две команды:

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;"

Если какая-либо команда показывает существующую настройку

Используйте Xcode или любой другой подходящий редактор списка свойств, чтобы удалить соответствующий словарь из LSHandlersключа в следующем файле:

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

Подсказки:


Добавление в настройки LaunchServices, чтобы Терминал мог просматривать и редактировать файлы .sh

Две однострочные команды.

В зависимости от ваших требований может быть достаточно только первой команды:

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"; }'

Чтобы новые предпочтения были соблюдены

Изменения уровня сохраняемости пользовательского домена Launch Services должны быть подтверждены . При этом наименее разрушительными для конечного пользователя будут:

  • перезапуск операционной системы.

Из командной строки, если возможен немедленный перезапуск:

sudo shutdown -r now


Задний план

Понимание поддержки Terminal.app для .sh (public.shell-script)

Рассмотрим результат следующей команды:

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

Терминал в стороне на мгновение: иногда неуместно (или просто бесполезно) принудительно открывать тип документа приложением, которое разработано без поддержки этого типа.

Для терминала я не вижу никакого вреда в работе с этим public.shell-scriptтипом.

@Lri в двух или более тестах Терминал работал, как и ожидалось, с простой однострочной строкой !sh — после завершения выполнения lsregister. Но (как вы заметили в другом вопросе) использование lsregisterтаким образом не без раздражения. Я опубликую кое-что в Ask Different Chat для вашего внимания.
Я действительно надеялся, что у @Lri есть мудрые слова. Я просил подробностей, а Грэм - вы очень много подробностей. Я не могу применить ваш ответ на практике (но, возможно), но я очень ценю дополнительные взгляды и предложения по этому поводу.
Спасибо ! — ожидайте, что серая область этого ответа будет со временем приведена в порядок.