Cela devient compliqué, car il y a deux niveaux d'interprétation des citations/escapades (d'abord par le shell, puis par le defaults
), et leurs règles syntaxiques sont quelque peu différentes. La réponse courte est d'utiliser "'a\\'b\"c'"
. Voici une démonstration :
$ defaults write testdomain testkey "'a\\'b\"c'"
$ defaults read testdomain testkey
a'b"c
Pour savoir comment citer/échapper une chaîne de ce type, il est plus facile de remonter les couches : commencez par la chaîne finale que vous voulez stocker, puis trouvez comment citer/échapper cette chaîne pour defaults
puis prendre le résultat de que et de trouver comment le citer ou l'échapper pour le shell.
Nous commençons donc par la dernière chaîne à stocker :
a'b"c
defaults
aime les chaînes complexes qui doivent être citées, et tout guillemet du même type à l'intérieur de la chaîne doit être échappé par une barre oblique inverse. Voici donc cette chaîne avec defaults
-compatibilité des citations :
'a\'b"c'
Nous devons maintenant trouver comment faire en sorte que l'interpréteur de commandes transmette cette information à defaults
comme argument. La syntaxe du shell n'autorise pas les guillemets simples dans une chaîne à guillemets simples (même s'ils sont échappés), il est donc plus simple de la mettre entre guillemets doubles. À l'intérieur des guillemets doubles, les guillemets simples ne nécessitent pas de traitement particulier, mais les guillemets doubles et les échappements doivent tous deux être échappés. Vous pouvez donc utiliser ceci :
"'a\\'b\"c'"
Une autre possibilité serait de ne pas mettre la chaîne entre guillemets, mais d'échapper individuellement à tous les guillemets et à tous les échappements qu'elle contient :
\'a\\\'b\"c\'
(Le triple échappement est un échappement suivi d'un échappement pour le guillemet simple. Bien sûr, il y a un pertinent xkcd .)