é um script que um programa está sendo executado sob o shell atual ou um shell filho?

3

Estou confuso com relação ao seguinte - se eu executar um script ou executar um programa no shell atual, digitando em seu nome

  1. ele procura na variável $ PATH, para encontrar a localização do executável
  2. depois de encontrá-lo, ele executa o executável no shell atual ou gerará um shell / processo filho para executar o executável?

Eu acredito que um novo processo filho será gerado para executar o executável, mas tendo dito isso, como o processo filho sabe (o caminho para o executável) para executar o executável? - se eu alterei o PATH no shell pai para que ele possa encontrar o executável (usando somente PATH = $ PATH: / newpath / to / executable) mas não fazendo uma exportação

e.g., — I did not do an export here
$ PATH=$PATH:/path/to/executable
$ executable 

Quando o shell pai encontra o executável, o que ele faz a seguir (gerar um processo filho? execute o executável?). Mas, novamente, como o processo filho encontra o executável quando o ambiente PATH editado não é exportado para ele

    
por Noob 05.08.2015 / 18:43

2 respostas

3

Normalmente, não é o pai que pesquisa $PATH . Geralmente é o kernel.

Internamente, gerar um novo processo é um fork (cria um novo processo, mas continua executando o código atual; o pai e o filho geralmente entram em sua própria ramificação if ) seguido por um (substitui a imagem do processo atual por uma nova imagem do processo) com elementos opcionais (como redirecionamentos de arquivadores ou configurações de sinal) entre eles.

Os exec * p membros da família exec (a família exec está prestes a fazer o mesmo coisa de maneiras diferentes) faça o kernel pesquisar a variável de ambiente $PATH ao resolver um argumento que não tenha uma barra nele.

Uma vez que o caminho é resolvido, o kernel tenta executá-lo como um binário, recorrendo à linha shebang se o primeiro falhar e o executável tiver uma linha shebang. Se a linha shebang for usada, o interpretador especificado nela será executado e passará pelo caminho resolvido.

    
por 05.08.2015 / 19:18
0

Existe diferença entre o processo sub-shell e o processo filho. O que você está perguntando é sobre o subshell.

Sempre que o shell pai for executável, ele gerará um subshell, e o subshell terá acesso a todas as variáveis do shell pai. É por isso que o PATH variável também é acessível para o subshell.

Quando o shell pai gera um processo filho, o acesso às variáveis é restrito no processo filho.

Você pode verificar seguindo o comando.

desmarque a; a = 1
(echo "a é $ a no subshell")
sh-ec 'echo "a é $ a no shell filho"'

Para mais informações, consulte o link subshell info

    
por 22.08.2015 / 15:22