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

3

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

Estou tentando preparar modulefiles (ou seja, do tipo usado pelo pacote environment-modules) para configurar ambiente e aliases para software de terceiros. Alguns dos apelidos, em particular, estão me dando tristeza. Os arquivos de recursos do shell fornecidos pelo autor - que eu espero fugir e para um ambiente de agnóstico de shell, daí meu interesse em modulefiles - definem aliases que incorporam chaves literal. 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", conforme 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).

Eu não consigo me afastar de nenhum desses elementos - o eval, a falta de aspas duplas em torno da string avaliada ou as aspas simples ao redor do texto do alias - sem compilar uma versão personalizada dos módulos, que eu odeio fazer.

Agora, se o alias contiver chaves, não vejo como, no contexto de uma declaração eval, protegê-las para que não sejam interpretadas. Eu tentei barras invertidas daqui para Timbuktu, eu tentei aspas duplas, eu tentei aspas simples, eu tentei aspas simples entre aspas duplas, eu tentei combinações do acima. Até agora, nada funcionou e está chegando ao absurdo. Apesar do extenso pesquisamento, não consegui encontrar nenhuma resposta.

Existe uma maneira de escapar das chaves? Se não, avise-me e continuarei com a minha vida; se assim for, e não envolve qualquer recompilação, eu apreciaria muito qualquer conselho. Obrigado!

    
por Valtandor 27.04.2012 / 04:01

3 respostas

1

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

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

Eu faço o mesmo para um cifrão, que tenho dificuldade em escapar. Altamente útil para expressões regulares do grep.

Aqui está o meu recorte / cole 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}

Note que você precisa dessas aspas extras.

Espero que isso ajude!

    
por 23.05.2014 / 20:39
1

Outra solução:

set-alias foo {env LD_LIBRARY_PATH='printf "43LD_LIBRARY_PATH5"':/some/path command-to-run}

Os números 044, 173 e 175 são códigos octal para caracteres ascii $, {e}

    
por 08.01.2016 / 03:49
0

Use 2 aspas simples para proteger as chaves (escapes). Você pode precisar de uma aspa dupla (") quando fizer eco da variável:

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

Além disso, o eco dentro de citações anteriores ( ) pode ser usado com os colchetes com escape:

set b = " COMMANDS 'echo ''{''' MORE COMMANDS 'echo ''}''' "  
echo "$b"
    
por 19.12.2016 / 19:36

Tags