Por que o código shell local :: lib usa eval e $ ()?

2

usando local :: lib requer que você adicione uma linha ao seu ~/.shellrc

eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)

Eu não entendo qual é o sentido de usar eval e de encapsular a instrução em $() . Eu também percebo que csh não requer que você os use. Então, eu estou querendo saber qual é a diferença, e se devo ou não usar isso para o shell bourne genérico, ou zsh .

    
por xenoterracide 18.12.2010 / 23:13

1 resposta

5

perl -I$HOME/perl5/lib/perl5 -Mlocal::lib imprime algum código de shell. O ponto de eval $(…) é executar esse código no contexto do shell atual. Isso é normalmente usado para definir variáveis de ambiente. Você não pode usar um subprocesso para isso, pois isso afetaria apenas o ambiente do subprocesso. Você pode criar um snippet:

. /path/to/snippet-containing-variable-definitions

mas isso só funciona se o código que gera os valores das variáveis for escrito em shell. Aqui esse código é escrito em Perl, então o código Perl gera código shell.

O

dircolors usa a mesma técnica, assim como muitos outros programas.

Os fragmentos de shell são geralmente muito simples, apenas atribuições de variáveis (com strings simples para valores) e export , então são compatíveis com todos os shells do tipo Bourne (incluindo qualquer shell POSIX) e zsh. local::lib é gratuitamente incompatível com alguns sistemas antigos, pois combina export com atribuição (o que é permitido pelo POSIX, mas não pelo shell Bourne original). Csh requer uma sintaxe diferente; local :: lib emite a sintaxe csh se $SHELL contiver csh como substring. No Windows, local :: lib gera a sintaxe cmd equivalente; porque o cmd não tem equivalente.

    
por 19.12.2010 / 00:16