Я ищу способ систематически вводить еще несколько расширений в базу данных служб запуска OS X, чтобы при нажатии они выполнялись в терминальном приложении так же, как файлы .command по умолчанию.
Было бы неплохо начать с таких вещей, как .ksh
, .sh
, и , но я полагаю, что как только я выясню, как добавить один, все остальное будет легко сделать..csh
Ответ, специфичный для Lion или Snow Leopard, подходит, поэтому общий ответ для всех версий ОС не требуется. Было бы здорово, если бы это можно было использовать в сценариях и записывать непосредственно в базу данных Launch Services, чтобы я мог автоматизировать это, а не искать на каждом Mac и много щелкать.
Если файл открыт с помощью Терминала и у него установлен бит выполнения, то Терминал выполнит его.
Получите информацию о файле .sh и установите его для открытия с помощью терминала, а затем нажмите кнопку «Изменить все».
В большинстве случаев все, что требуется, должно быть возможно из командной строки…
Две команды:
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
Подсказки:
defaults
, с которым я более знаком, кажется непригодным для удаления одного словаря из массива.sh
файлов с приложением, отличным от системного по умолчаниюPlistBuddy
— кредит Дэниелу Беку .Две однострочные команды.
В зависимости от ваших требований может быть достаточно только первой команды:
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
Рассмотрим результат следующей команды:
defaults read /Applications/Utilities/Terminal.app/Contents/Info
под CFBundleDocumentTypes
( массив словарей, описывающих поддерживаемые бандлом типы документов ) мы видим, что Терминал предназначен для поддержкиcom.apple.terminal.shell-script
public.shell-script
( объявленный системой UTI, связанный с .sh
) не поддерживается на этом уровне, он отображается в другом месте в списке свойств — в разделеUTExportedTypeDeclarations
Терминал в стороне на мгновение: иногда неуместно (или просто бесполезно) принудительно открывать тип документа приложением, которое разработано без поддержки этого типа.
Для терминала я не вижу никакого вреда в работе с этим public.shell-script
типом.
lsregister
. Но (как вы заметили в другом вопросе) использование lsregister
таким образом не без раздражения. Я опубликую кое-что в Ask Different Chat для вашего внимания.
bmike
Грэм Перрин
Грэм Перрин