¿Cómo crear un archivo plist binario desde la línea de comando en OS X?

¿Estoy buscando una solución para crear un archivo plist binario desde la línea de comando en OS X?

Quiero crear ~/.MacOSX/environment.plisty configurar PATHallí.

Sé que este archivo plist tiene que estar en formato binario y sé cómo escribirlo usando el defaults writecomando. Aún así, necesito crear el archivo antes de hacer esto, y crear un archivo vacío no funciona.

Nota: necesito una solución de línea de comando.

Respuestas (3)

También puede crear una lista de propiedades XML o de estilo antiguo y convertirla con Plutil:

plutil -convert binary1 test.plist

Modifica los archivos en su lugar por defecto. Puede especificar un archivo de salida diferente con -oo imprimir en la salida estándar con -o -.

Al menos desde Mac High Sierra (10.13.4), defaults write(por ejemplo, ya sea de la forma defaults write com.example.test '{a = (b, 2);}'o defaults write com.example.testb "a" '(b, 2)') está creando archivos plist binarios para mí ~/Library/Preferences/incluso cuando el archivo aún no se ha creado.

Y se puede crear en una ruta particular intercambiando un dominio con la ruta de archivo deseada, por ejemplo,

defaults write "/users/brett/Desktop/com.example.testc"  "a" '(b, 2)'

La sintaxis XML también funciona:

defaults write "/users/brett/Desktop/com.example.testc" '<dict><key>a</key><array><string>b</string><string>2</string></array></dict>'

(Suministrar JSON no funciona (a pesar plistde poder convertirlo a JSON).)

También se puede usar defaults importpara crear un nuevo archivo plist binario, ya sea defaults import <domain> -que le permita (a través de stdin) usar cualquiera de las sintaxis anteriores (o defaults import <domain> pathToExistingPlist, suponiendo que el plist al que se hace referencia sea en sí mismo un archivo binario).

Finalmente, se puede usar defaults exporten un archivo existente, suponiendo que se exprese como XML o la lista de propiedades ASCII (u otra lista binaria).

defaults export com.example.test1 /path/for/com.example.testcopy.plist

Este último es similar al comportamiento del comando plutil en la respuesta de @user495470, excepto que solo se copiará en su lugar si especifica una ruta en el segundo argumento que conduce al mismo archivo al que se hace referencia en el primero (dominio).

Con la excepción de la última exportsintaxis (que crea un vacío <dict>al encontrar un tipo que no es dictado en la raíz), para cualquiera de los anteriores, se dan errores al intentar cualquier cosa que no sea un dictado en la raíz.

Esta pieza de bash resolvió mi problema:

if [ ! -f '~/.MacOSX/environment.plist' ]; then
  mkdir -p '~/.MacOSX'
  defaults write ~/.MacOSX/environment.plist TEST_VAR 1
fi

Aún así, debo advertir a los demás que parece que OS X 10.8 no está cargando el archivo.