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.
Odircolors 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.