O eval foi implementado criando um processo de shell para avaliar o seguinte comando?

0

Em eval <command> , como eval avalia o seguinte comando?

  • será que eval cria um subprocesso shell para avaliar <command> ?

  • Se não, o eval depende do processo atual do shell para avaliá-lo?

Note que

  • eval é um embutido, então não há subprocesso criado para eval .
  • Logo antes de o <command> ser executado, pode ou não haver um subprocesso criado para executá-lo, dependendo se o <command> não é interno.

O sub-processo shell para avaliar o comando mencionado acima não é um dos dois mencionados na nota.

Obrigado.

    
por Tim 19.07.2016 / 14:16

3 respostas

3

O que o eval efetivamente faz é analisar os argumentos, expandir as variáveis etc etc e, em seguida, a sequência resultante é executada normalmente.

Então, por exemplo:

$ i=ls
$ eval $i

O eval aqui substituirá $i por ls e então executará o comando ls como normal (assim será fork() / exec() para executar o ls process).

Se, no entanto, você fez

$ i="echo hello"
$ eval $i
hello

nenhum novo processo é criado porque o echo hello é executado como um arquivo interno.

Nós podemos ver que nenhum shell é criado configurando variáveis:

$ a=0
$ i="a=100"
$ eval $i
$ echo $a
100

$a só poderia ser definido para 100 se isso fosse feito no shell atual.

Portanto, o eval em si é realmente apenas um analisador e é feito no shell atual; os resultados dessa cadeia podem ou não criar um novo processo, da mesma forma que qualquer outro comando.

    
por 19.07.2016 / 14:45
2

Eu não sei sobre o básico, mas na prática, ele é executado como source somefile , onde ele executa esses comandos no seu processo de shell atual, sem gerar um novo processo.

E também usaria a palavra "string" em vez de "comandos", já que é isso que faz. Isso funciona, mas não tem comando:

$ eval ""

Ou o que não é tecnicamente um comando:

$ eval "x(){ echo test;}"
$ x
test

E para mostrar que nem sempre está fazendo um novo processo (então eu discordo de William):

em um terminal:

$ echo $$
9983
$ eval "sleep 100"  

em outro:

$ ps -ef --forest
peter     9983  2840  0 14:21 pts/41   00:00:00  \_ /bin/bash
peter    17339  9983  0 14:26 pts/41   00:00:00  |   \_ sleep 100

Mas se você fizer isso, por algum motivo:

$ eval 'sleep 100' &
[1] 20675

$ ps --forest
  PID TTY          TIME CMD
 9983 pts/41   00:00:00 bash
20675 pts/41   00:00:00  \_ bash
20676 pts/41   00:00:00  |   \_ sleep
20757 pts/41   00:00:00  \_ ps
    
por 19.07.2016 / 14:33
2

O Eval não cria um novo processo apenas para o propósito de eval .

O Eval executa novamente o analisador com uma concatenação dos eval -arguments.

O resultado dessa análise é executado no mesmo shell. Se os argumentos, no entanto, exigirem a criação de um sub-shell para o comando, isso é feito.

Portanto, o objetivo principal do eval é executar novamente o analisador.

    
por 19.07.2016 / 16:44

Tags