¿Cómo definir una matriz con un solo comando `por defecto`?

Quiero que un dominio com.apple.keyboard.modifiermapping.1452-628-0contenga la siguiente matriz:

(
        {
        HIDKeyboardModifierMappingDst = 2;
        HIDKeyboardModifierMappingSrc = 0;
    },
        {
        HIDKeyboardModifierMappingDst = 0;
        HIDKeyboardModifierMappingSrc = 2;
    },
        {
        HIDKeyboardModifierMappingDst = 0;
        HIDKeyboardModifierMappingSrc = 10;
    }
)

Puedo lograrlo eliminando el valor actual y ejecutando tres -array-addcomandos:

defaults -currentHost delete -g com.apple.keyboard.modifiermapping.1452-628-0
defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 -array-add '{ HIDKeyboardModifierMappingDst = 2; HIDKeyboardModifierMappingSrc = 0; }'    
defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 -array-add '{ HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 2; }'    
defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 -array-add '{ HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 10; }'
defaults -currentHost read -g com.apple.keyboard.modifiermapping.1452-628-0

¿Qué sintaxis puedo usar para definir la matriz en un solo comando?


  • Si ejecuto el siguiente script:

    defaults -currentHost delete -g com.apple.keyboard.modifiermapping.1452-628-0
    defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 -array '(
      { HIDKeyboardModifierMappingDst = 2; HIDKeyboardModifierMappingSrc = 0; },
      { HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 2; },
      { HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 10; } )' 
    defaults -currentHost read -g com.apple.keyboard.modifiermapping.1452-628-0
    

    Obtengo una matriz dentro de una matriz:

    (
            (
                    {
                HIDKeyboardModifierMappingDst = 2;
                HIDKeyboardModifierMappingSrc = 0;
            },
                    {
                HIDKeyboardModifierMappingDst = 0;
                HIDKeyboardModifierMappingSrc = 2;
            },
                    {
                HIDKeyboardModifierMappingDst = 0;
                HIDKeyboardModifierMappingSrc = 10;
            }
        )
    )
    
  • Si pruebo con -plisten lugar de -arrayobtengo un Unexpected argument.

  • Si ejecuto el siguiente script:

    defaults -currentHost delete -g com.apple.keyboard.modifiermapping.1452-628-0    
    defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 -array '
      { HIDKeyboardModifierMappingDst = 2; HIDKeyboardModifierMappingSrc = 0; },
      { HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 2; },
      { HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 10; }'
    defaults -currentHost read -g com.apple.keyboard.modifiermapping.1452-628-0
    

    me sale un error de sintaxisdefaults[22044:679428] Could not parse: ... Try single-quoting it.


Pregunta nuevamente: ¿qué sintaxis puedo usar para definir la matriz en un solo comando?

Respuestas (1)

-arraytoma elementos de matriz individuales como argumentos individuales.

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 -array \
  '{ HIDKeyboardModifierMappingDst = 2; HIDKeyboardModifierMappingSrc = 0; }' \
  '{ HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 2; }' \
  '{ HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 10; }'

Los '\' se usan para hacer que el shell espere la siguiente línea, por lo que se pueden omitir si se escriben en una sola línea. No necesita usar deleteprimero: a diferencia de -array-add, -arrayreemplaza toda la matriz con los nuevos contenidos.

Si no quiere hacerlo de esta manera, aquí hay una alternativa: puede pasar la estructura de datos como una cadena. Esto está más cerca de los ejemplos en su pregunta y funciona igual.

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-628-0 '(
  { HIDKeyboardModifierMappingDst = 2; HIDKeyboardModifierMappingSrc = 0; },
  { HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 2; },
  { HIDKeyboardModifierMappingDst = 0; HIDKeyboardModifierMappingSrc = 10; } )' 
Esto responde perfectamente a mi pregunta. Sin embargo, ¿debería hacer otra pregunta sobre cómo hacerlo con un solo argumento? Mi intención era proporcionar una estructura de datos única, y al escribir la pregunta, no me di cuenta de que "un solo comando" y "una sola estructura de datos" eran requisitos que podían cumplirse de diferentes maneras.
@techraf Edité mi respuesta para incluir un método de cadena única, vea si eso es mejor
¡Oh! Ahora lo entiendo. -arrayy -dictson opcionales. Y traté de convencerlo con inexistente -plist... ¡Gracias!