Em csh/tcsh, como posso incorporar chaves literais em um comando que é processado com eval?

Em csh/tcsh, como posso incorporar chaves literais em um comando que é processado com eval?

Para dar mais detalhes, a situação é esta.

Estou tentando preparar modulefiles (ou seja, do tipo usado pelo pacote Environment-Modules) para configurar ambiente e aliases para software de terceiros. Alguns dos pseudônimos, em particular, estão me incomodando. Os arquivos de recursos do shell fornecidos pelo autor - que espero fugir de um ambiente independente do shell, daí meu interesse em modulefiles - definem aliases que incorporam chaves literais. Quando tento colocar a mesma string no modulefile, o conteúdo das chaves é expandido.

Parece que em csh/tcsh, o comando set-alias do modulefile é processado e transformado no comando "alias" oferecido pelo shell. Isso é então processado usando eval, da seguinte maneira:

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

(sim, o ponto e vírgula final faz parte do comando).

Não consigo fugir de nenhum desses elementos - a avaliação, a falta de aspas duplas na string avaliada ou as aspas simples no texto do alias - sem compilar uma versão personalizada dos módulos, o que detesto fazer.

Agora, se o alias contiver chaves, não consigo ver como, no contexto de uma instrução eval, protegê-los para que não sejam interpretados. Tentei barras invertidas daqui até Timbuktu, tentei aspas duplas, tentei aspas simples, tentei aspas simples dentro de aspas duplas, tentei combinações dos itens acima. Até agora, nada funcionou e está beirando o absurdo. Apesar da extensa pesquisa no Google, não consegui encontrar nenhuma resposta.

Existe uma maneira de escapar do aparelho encaracolado? Se não, me avise e continuarei com minha vida; em caso afirmativo, e não envolve qualquer recompilação, agradeceria muito qualquer conselho. Obrigado!

Responder1

Minha solução para tcsh/csh é um pouco detalhada. É colocar "{" em uma variável separada.

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

Faço o mesmo com o cifrão, do qual tenho dificuldade em escapar. Altamente útil para expressões regulares grep.

Aqui está meu recortar/colar do meu .cshrc:

  set dollar = \$

O resultado do uso, como eu disse, é detalhado, mas pelo menos funciona:

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

Observe que você precisa dessas aspas extras.

Espero que isto ajude!

Responder2

Outra solução:

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

Os 044, 173 e 175 são códigos octais para caracteres ascii $, { e }

Responder3

Usar2 aspas simplespara proteger (escapar) chaves. Você pode precisar de aspas duplas (") ao repetir a variável:

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

Além disso, echo entre aspas ( ) pode ser usado com colchetes escapados:

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

informação relacionada