¿Cómo manejo (p. ej., escape correctamente) los paréntesis en un valor de clave de 'escritura predeterminada...'?

TL;RD

En defaults write <domain> <key> <value>, ¿cómo proporciono un <value>que contiene paréntesis; es decir, corchetes "redondos", "(" y ")" ?

Bhoona completo

Estoy usando defaultspara redirigir capturas de pantalla a un directorio específico. Eso puedo hacerlo bien, y lo he hecho muchas veces en el pasado, pero me encuentro con un problema cuando el directorio de destino tiene paréntesis en su nombre de ruta. Así que estoy haciendo algo como:

$ defaults write com.apple.screencapture location <dirname-with-parens-in-it>

y estoy recibiendo un error de la forma:

<ba bla bla> Could not parse: <dirname-with-parens-in-it>.  Try single-quoting it.

Pero lo entiendo a pesar de intentar todo lo siguiente (y un montón más además). En esto, suponga que el nombre del directorio (preexistente) en cuestión es, literalmente, dirname(with)parens. Mis intentos y respuestas:

$ defaults write com.apple.screencapture location dirname\(with\)parens
<bla bla bla> Could not parse: dirname(with)parens.  Try single-quoting it.

$ defaults write com.apple.screencapture location 'dirname\(with\)parens'
<bla bla bla> Could not parse: dirname(with)parens.  Try single-quoting it.

Y repetí ambos, tres veces cada uno, reemplazando el único \ con \\, \\\ y \\\\. Mismo error.

Tenga en cuenta, sin embargo, que el error parece sugerir que el shell englobado en sí mismo está funcionando bien, porque 'predeterminado' está viendo el "(" y ")" sin escape correctamente. Y si el nombre/ruta del directorio no contiene paréntesis sino espacios en blanco, entonces un simple \-escape funciona bien (al igual que las comillas). Finalmente, observo que para los comandos de shell, como "mkdir", ya sea de paréntesis \-escape o entrecomillados, también funcionan:

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

Así que un probable sospechoso es defaultsél mismo. man defaultsno ofrece mucho, solo dice que solo dice que "el valor debe ser una lista de propiedades y debe estar entre comillas simples" . E incluso eso es mentira. En la práctica, solo debe estar entre comillas simples si contiene algo raro, e incluso allí, si lo raro es un espacio en blanco, \-escaping servirá. Y, por supuesto, si lo original es parens, entonces ni siquiera las comillas simples parecen funcionar.

Entonces, ¿alguna idea? ¡Gracias!

PD: estoy al tanto y he usado soluciones alternativas. Por ejemplo, puedo crear un enlace simbólico no problemático al directorio real infestado de paréntesis y simplemente dar defaultsel enlace simbólico como el archivo <value>. Pero realmente me gustaría llegar al fondo de esto.

Respuestas (1)

Para escapar de los paréntesis con éxito en el comando predeterminado, debe usar comillas y, dentro de las comillas, comillas simples:

Ejemplo:

defaults write com.apple.screencapture location "'/Users/user/Desktop/(Screenshots)'"
¡Dios mío, el simple dentro del doble tiene que ser lo único que no probé! Gracias. De hecho, ciertamente probé el doble dentro del sencillo y eso también parece funcionar. Desafortunadamente, no fue así para mí en ese momento, pero parece que estaba agravando el problema al proporcionar a veces el nombre de directorio sin la ruta completa (pensando que el shell proporcionaría la ruta de todos modos).