Esto se complica, porque hay dos capas de interpretación de citas/escapes (primero por el shell, luego por defaults
), y tienen reglas sintácticas algo diferentes. La respuesta corta es utilizar "'a\\'b\"c'"
. Aquí tienes una demostración:
$ defaults write testdomain testkey "'a\\'b\"c'"
$ defaults read testdomain testkey
a'b"c
Para averiguar cómo citar/escapar una cadena como ésta, lo más fácil es trabajar hacia atrás a través de las capas: empezar con la cadena final que se quiere almacenar, y luego averiguar cómo citar/escapar eso para defaults
y luego tomar el resultado de que y averiguar cómo citar/escapar para la cáscara.
Así que empezamos con la cadena final a almacenar:
a'b"c
defaults
le gusta que las cadenas complejas sean entrecomilladas, y cualquier tipo de comilla dentro de la cadena necesita ser escapada con una barra invertida. Así que aquí está esa cadena con defaults
-Citas compatibles:
'a\'b"c'
Ahora tenemos que averiguar cómo hacer que el shell pase eso a defaults
como argumento. La sintaxis de la shell no permite las comillas simples en una cadena con comillas simples (incluso si están escapadas), por lo que las comillas dobles serán más sencillas. Dentro de las comillas dobles, las comillas simples no requieren ningún tratamiento especial, pero las comillas dobles y los escapes necesitan ser escapados. Así que puedes usar esto:
"'a\\'b\"c'"
Otra posibilidad sería no entrecomillar la cadena en absoluto, sino escapar individualmente todas las comillas y escapes en ella:
\'a\\\'b\"c\'
(El triple escape es un escape de la comilla, seguido de un escape de la comilla simple. Por supuesto, hay un xkcd relevante .)