Это выполнимо, но, вероятно, не так просто, как вы думаете. Вам нужно будет очень хорошо ознакомиться с унифицированными идентификаторами типов. Посмотрите на страницу Универсального идентификатора типа в Википедии .
OS X хранит информацию о предпочтительных ассоциациях файлов в файле настроек с именем com.apple.LaunchServices.plist
. Прежде чем вы попытаетесь найти и изменить этот файл, я предлагаю вам ознакомиться с иерархией доменов OS X для значений по умолчанию (так называемые «настройки»). Достойную статью об этом можно найти здесь . (Отказ от ответственности: они, кажется, что-то продают на этом сайте. Я не знаю, что это такое, и не имею к ним никакого отношения, объяснение просто хорошее.)
Теперь, когда вы знаете все о значениях по умолчанию и UTI (а не о медицинском виде), теперь мы можем поговорить о настройке ассоциаций файлов из сценария / командной строки.
Во-первых, вам нужно знать, как правильно определить файлы, для которых вы хотите создать ассоциацию.
Помните, как я сказал, что ИМП были важны? Есть несколько способов идентифицировать файл. Это зависит от того, был ли тип официально объявлен в вашей системе или нет. Например, приличные текстовые редакторы, такие как TextMate или TextWrangler, добавят довольно много объявлений типов в иерархию типов при их использовании в вашей системе. Однако, если у вас нет этих приложений, возможно, вы не объявили эти типы.
ОК, хватит разговоров. Примеры:
Получить UTI для файла:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
Окей круто. Явный тип контента, который мы можем использовать. Запишите это где-нибудь.
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
К сожалению. OS X не знает о файлах ".myExtn". Таким образом, он создал динамический UTI, который мы не можем использовать ни для чего. И родительские типы слишком универсальны, чтобы быть полезными.
Теперь, когда мы знаем, что такое наши файлы, давайте посмотрим на файл LaunchServices.plist и посмотрим, что мы можем сделать:
$defaults read com.apple.LaunchServices
{
...
LSHandlers = (
{
LSHandlerContentType = "public.html";
LSHandlerRoleAll = "com.apple.safari";
LSHandlerRoleViewer = "com.google.chrome";
},
...
{
LSHandlerContentTag = myExtn;
LSHandlerContentTagClass = "public.filename-extension";
LSHandlerRoleAll = "com.macromates.textmate";
},
...
);
...
}
Таким образом, когда у вас есть «хороший» тип контента для использования, первая конструкция лучше. В противном случае другая конструкция. Обратите внимание, что в этом файле есть другие конструкции, но они не имеют отношения к тому, что вы просили. Просто знайте, что они есть, когда вы просматриваете вывод.
Как видите, вам нужно найти UTI для приложения, которое вы хотите использовать. UTI для Safar и TextMate приведены в моем примере выше, но для общего поиска UTI для приложения:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
ПРИМЕЧАНИЕ. Я понятия не имею, в чем состоит различие между LSHandlerRoleAll и LSHandlerRoleViewer. Я не могу найти документацию по этому вопросу нигде. Что делать видим, что 99% времени LSHandlerRoleAll является только один набор (т.е. нет LSHandlerRoleViewer вообще) , и что он установлен в УИП для приложения , которое вы желаете связать тип с.
Проведя вас так далеко, я собираюсь оставить КАК установить желаемые значения в качестве упражнения для читателя. Возиться с этими вещами может быть несколько опасно. Для вас вполне возможно испортить файл и не работать ни с одной из ваших ассоциаций файлов. Затем вы должны выбросить файл и начать все сначала.
Некоторые намеки:
- Читайте дальше
defaults write
и его синтаксис
- Посмотрите на
PlistBuddy
. man PlistBuddy
а также/usr/libexec/PlistBuddy -h
- Пропустите всю эту ерунду и используйте RCDefaultApp