Evitar que a substituição de comandos seja avaliada ao anexar a um arquivo

1

Como posso impedir que a instrução eval avalie quando está sendo anexada a um arquivo como parte de um comando cat << __EOF__ ?

TL; DR

Eu gerencio serviços em um grande número de servidores Linux. Freqüentemente, eu fico com dor de cabeça, devido a algumas das cores de terminal padrão especificadas por LS_COLORS , então eu escrevi um script rápido que eu poderia simplesmente colar no terminal para corrigir os problemas de cor. Este script é:

cat >> ~/.dircolors << __EOF__
OTHER_WRITABLE 01;30;41 # dir that is other-writable (o+w) and not sticky
__EOF__
cat >> ~/.bashrc << __EOF__

# Customize directory listing colors.
eval 'dircolors ~/.dircolors'
export LS_COLORS
__EOF__
eval 'dircolors ~/.dircolors'

Isso funciona bem para a sessão em que eu especifico, mas quando eu entro de volta, recebo o seguinte erro:

-bash: 30: command not found
-bash: 41:: command not found
[me@myserver ~]$

Como eu tenho certeza que alguns de vocês perceberam, quando eu olho para o meu .bashrc , as últimas 4 linhas são assim:

# Customize directory listing colors.
eval LS_COLORS='ow=01;30;41:';
export LS_COLORS
export LS_COLORS

No entanto, se eu alterar de volta para:

eval 'dircolors ~/.dircolors'

tudo funciona bem no próximo login.

    
por Doug R. 01.06.2016 / 20:17

2 respostas

2

O que está sendo avaliado aqui não é eval . A palavra eval no seu script é completamente inerte. Você notará que aparece na saída, afinal.

O que está sendo avaliado é a substituição de comando (a parte nos backticks). Para incluir os backticks literais no texto que é gravado no arquivo, proteja-os com barras invertidas:

cat >> ~/.bashrc << __EOF__

# Customize directory listing colors.
eval \'dircolors ~/.dircolors\'
export LS_COLORS
__EOF__

Como alternativa, torne o documento here um literal, ou seja, um que tome o texto como está, em vez de executar a substituição de variáveis e comandos. Você faz isso citando qualquer parte do marcador final após o operador << .

cat >> ~/.bashrc <<\__EOF__

# Customize directory listing colors.
eval 'dircolors ~/.dircolors'
export LS_COLORS
__EOF__
    
por 02.06.2016 / 01:42
1

O ; divide as instruções no código shell, então o que está acontecendo é o eval runs LS_COLORS=ow=01 e, em seguida, o comando 30 e, em seguida, o comando 41: . Isso pode ser observado com algum teste echo chamadas:

% echo 'test;echo hi;echo there'
test;echo hi;echo there
% eval echo 'test;echo hi;echo there'
test
hi
there
% 

Uma solução envolve mais citações:

% eval "echo 'test;echo hi;echo there'"
test;echo hi;echo there
% 

Tal que eval só vê um comando echo (com alguns args) e não uma lista de comandos ; delimitados.

    
por 01.06.2016 / 20:56