Você pode explicar a expressão eval no padrão .bashrc

2

Eu estava procurando dentro de /etc/skel/.bashrc e encontrei esta linha:

[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

Eu entendo o que o teste -x faz, mas tudo em frente com eval não é compreensível.

Além disso, quando eu executar esta linha em outras distribuições Linux, isso causará um erro:

#  eval "$(SHELL=/bin/bash lesspipe)"
bash: syntax error near unexpected token 'newline'

Isto está no Ubuntu 14.04 (bash 4.3.11 (1)), e a outra versão bash que eu testei é 4.3.39 (1).

Você pode explicar o que esta linha está fazendo e por que estou recebendo o erro acima?

    
por Oz123 22.01.2016 / 18:17

1 resposta

1

Para entender o eval snippet eval "$(SHELL=/bin/sh lesspipe)" , precisamos dividi-lo:

  • Primeiro, vamos verificar o que SHELL=/bin/sh lesspipe retorna:

    $ SHELL=/bin/sh lesspipe
    export LESSOPEN="| /usr/bin/lesspipe %s";
    export LESSCLOSE="/usr/bin/lesspipe %s %s";
    

    Como você pode ver, ele retorna dois comandos contendo declarações de variáveis precedidas por export para torná-los variáveis de ambiente.

  • Agora outra coisa, $() é a sintaxe de substituição de comando que retorna exatamente o que vimos acima, ou seja, a saída de um comando, vamos verificar:

    $ echo "$(SHELL=/bin/sh lesspipe)"
    export LESSOPEN="| /usr/bin/lesspipe %s";
    export LESSCLOSE="/usr/bin/lesspipe %s %s";
    
  • Ok, e quanto a eval agora, então eval apenas executará os dois comandos retornados pela substituição de comandos:

    eval "$(SHELL=/bin/sh lesspipe)"
    

    depois disso, as variáveis LESSOPEN e LESSCLOSE serão variáveis de ambiente para o shell no qual este comando está sendo executado.

por heemayl 22.01.2016 / 18:36