3 votes

Existe-t-il un moyen d'inclure des guillemets simples et doubles dans une valeur de la commande `defaults write` ?

Supposons que je veuille ajouter cette chaîne à un domaine de préférence :

a'b"c

Puis-je le faire avec l'outil defaults commande ?

Cela ne fonctionnera pas (l'interpréteur de commandes attend d'autres données) :

defaults write testdomain testkey a'b"c
defaults write testdomain testkey 'a\'b"c'

Pas plus que ceci (erreur "Could not parse : a'b "c. Try single-quoting it.") :

defaults write testdomain testkey "a'b\"c"

9voto

Gordon Davisson Points 30215

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 .)

3voto

David Anderson Points 30783

Vous êtes suffisamment nouveau pour remplacer " avec \" . Cependant, vous devez répéter l'opération et remplacer également les éléments suivants \ avec \\ . Ainsi

a'b"c

devient

"a'b\"c"

qui devient

"\"a'b\\\"c\""

après deux passages. À partir de la ligne de commande, ceci peut être testé en entrant la commande suivante.

eval echo "\"a'b\\\"c\""

Cette commande produit les résultats suivants.

a'b"c

Dans votre cas, vous devez entrer la commande suivante.

defaults write testdomain testkey "\"a'b\\\"c\""

Ce qui peut être vérifié avec la commande suivante.

defaults read testdomain testkey

J'ai testé cette réponse en utilisant com.apple.Finder au lieu de testdomain .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X