3 votos

¿Hay alguna manera de incluir tanto las comillas simples como las dobles en un valor al comando `defaults write`?

Supongamos que quiero añadir esta cadena a un dominio de preferencias:

a'b"c

¿Puedo lograr eso con el defaults ¿comando?

Esto no funcionará (el intérprete de comandos espera a que se introduzcan más datos):

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

Tampoco esto (error "Could not parse: a'b "c. Try single-quoting it."):

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

9voto

Nate Puntos 220

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

3voto

David Anderson Puntos 2189

Eres lo suficientemente nuevo como para reemplazar " con \" . Sin embargo, hay que hacerlo de nuevo y también sustituir \ con \\ . Así que

a'b"c

se convierte en

"a'b\"c"

que se convierte en

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

después de dos pases. Desde la línea de comandos, esto se puede probar introduciendo el siguiente comando.

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

Este comando produce la siguiente salida.

a'b"c

En tu caso, introducirías el siguiente comando.

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

Lo que se puede comprobar con el siguiente comando.

defaults read testdomain testkey

De hecho, he probado esta respuesta utilizando com.apple.Finder en lugar de testdomain .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X