En csh/tcsh, ¿cómo puedo incorporar llaves literales en un comando que se procesa con eval?

En csh/tcsh, ¿cómo puedo incorporar llaves literales en un comando que se procesa con eval?

Para dar más detalles, la situación es la siguiente.

Estoy intentando preparar archivos de módulo (es decir, del tipo utilizado por el paquete de módulos de entorno) para configurar el entorno y los alias para software de terceros. Algunos de los alias, en particular, me dan pena. Los archivos de recursos de shell proporcionados por el autor, que espero alejarme y acercarme a un entorno independiente del shell, de ahí mi interés en los archivos de módulo, establecen alias que incorporan llaves literales. Cuando intento poner la misma cadena en el archivo del módulo, el contenido de las llaves se expande.

Parece que en csh/tcsh, el comando set-alias del archivo de módulo se procesa y se convierte en el comando "alias" ofrecido por el shell. Luego esto se procesa usando eval, de la siguiente manera:

eval `alias foo 'thing to alias foo to';`

(sí, el punto y coma final es parte del comando).

No puedo escapar de ninguno de esos elementos (la evaluación, la falta de comillas dobles alrededor de la cadena evaluada o las comillas simples alrededor del texto del alias) sin compilar una versión personalizada de los módulos, lo cual detesto. hacer.

Ahora, si el alias contiene llaves, no veo cómo, en el contexto de una declaración de evaluación, protegerlas para que no se interpreten. Probé barras invertidas desde aquí hasta Tombuctú, probé comillas dobles, probé comillas simples, probé comillas simples dentro de comillas dobles, probé combinaciones de las anteriores. Hasta ahora nada ha funcionado y roza lo absurdo. A pesar de buscar extensamente en Google, no he podido encontrar ninguna respuesta.

¿Hay alguna manera de escapar de las llaves? Si no, házmelo saber y seguiré con mi vida; Si es así, y no implica ninguna recopilación, agradecería mucho cualquier consejo. ¡Gracias!

Respuesta1

Mi solución para tcsh/csh es un poco detallada. Es colocar "{" en una variable separada.

  set lc="{"
  set rc="}"

Hago lo mismo con un signo de dólar, del que me cuesta escapar. Muy útil para expresiones regulares grep.

Aquí está mi cortar/pegar de mi .cshrc:

  set dollar = \$

El resultado del uso, como dije, es detallado, pero al menos funciona:

> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}

Tenga en cuenta que necesita esas comillas adicionales.

¡Espero que esto ayude!

Respuesta2

Otra solución:

set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}

044, 173 y 175 son códigos octales para caracteres ascii $, { y }

Respuesta3

Usar2 comillas simplespara proteger (escapar) llaves. Es posible que necesites una comilla doble (") cuando hagas eco de la variable:

set a=''{''
echo "$a"

Además, el eco entre comillas invertidas ( ) se puede utilizar con los corchetes de escape:

set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "  
echo "$b"

información relacionada