4 votes

Comment gérer (par exemple, échapper correctement) les parenthèses dans une clé de valeur de 'defaults write ...'?

TL;DR

Dans defaults write , comment puis-je fournir une qui contient des parenthèses ; i.e. "round" brackets, "(" et ")" ?

Full Bhoona

Je suis en train d'utiliser defaults pour rediriger les captures d'écran vers un répertoire spécifique. Je peux le faire correctement et l'ai fait de nombreuses fois par le passé, mais je rencontre un problème lorsque le répertoire cible contient des parenthèses dans son chemin. Ainsi, je fais quelque chose comme :

$ defaults write com.apple.screencapture location 

et je reçois une erreur de forme :

 Could not parse: .  Essayez de le mettre entre guillemets simples.

Mais j'obtiens cela malgré avoir essayé tout ce qui suit (et beaucoup plus encore). Dans ces essais, supposez que le nom du répertoire (préexistant) en question est, littéralement, dirname(with)parens. Mes tentatives et réponses :

$ defaults write com.apple.screencapture location dirname\(with\)parens
 Could not parse: dirname(with)parens.  Essayez de le mettre entre guillemets simples.

$ defaults write com.apple.screencapture location 'dirname\(with\)parens'
 Could not parse: dirname(with)parens.  Essayez de le mettre entre guillemets simples.

Et j'ai répété chacun d'eux, trois fois chacun, en remplaçant le simple \ par \\, \\\, et \\\\. Même erreur.

Remarquez cependant que l'erreur semble suggérer que le globbing du shell fonctionne bien, car 'defaults' voit correctement les parenthèses non échappées "(" et ")". Et si le nom/répertoire contient non pas des parenthèses mais simplement des espaces, alors un simple échappement \- fonctionne bien (tout comme les guillemets). Enfin, je remarque que pour les commandes shell, comme "mkdir", soit l'échappement \- des parenthèses, soit les mettre entre guillemets, fonctionnent également :

$ mkdir dirname\(with\)parens
$ ls -ld dirname*
drwxr-xr-x  2 jonyive demigods  68 Oct  3 10:56 dirname(with)parens

Ainsi, un suspect probable est defaults lui-même. man defaults n'offre pas beaucoup, disant seulement que, "value must be a property list, and must be enclosed in single quotes". Et même cela est un mensonge. En pratique, il ne doit être entre guillemets simples que s'il contient quelque chose d'étrange, et même là, si l'étrangeté est un espace, l'échappement \- fera l'affaire. Et bien sûr, si l'étrangeté sont les parenthèses, alors même les guillemets simples ne semblent pas fonctionner.

Alors, des idées ? Merci !

P.S. Je suis conscient et ai utilisé des astuces. Par exemple, je peux créer un lien symbolique non problématique vers le répertoire réel infesté de parenthèses, et donner simplement le lien symbolique à defaults comme le . Mais j'aimerais vraiment comprendre ce problème en profondeur.

8voto

klanomath Points 63400

Pour échapper aux parenthèses avec succès dans la commande par défaut, vous devez utiliser des guillemets et à l'intérieur des guillemets des apostrophes simples :

Exemple :

defaults write com.apple.screencapture location "'/Users/user/Desktop/(Screenshots)'"

0 votes

Mon Dieu, simple à l'intérieur du double doit être la seule chose que je n'ai pas essayée! Merci. En fait, j'avais certainement essayé le double à l'intérieur du simple et cela semblait aussi fonctionner. Malheureusement, cela n'a pas fonctionné pour moi à ce moment-là, mais il semble que je compliquais le problème en fournissant parfois le nom de dossier sans le chemin complet (pensant que le chemin serait de toute façon fourni par le shell).

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