Por que o shebang não faz com que um programa bifurque como deveria?

2

Eu sempre declaro a linha shebang #!/bin/bash no meu script de shell. Recentemente, quando chamei um script que contém uma chamada exit , ele matou meu terminal. Ele geralmente mata o processo bifurcado e retorna ao meu terminal. Por que poderia ter acontecido que parou o bifurcação?

EDITAR

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
  • Geralmente, invoco o script usando . script_path ou por meio de um link simbólico para o script.
por Martin 14.03.2011 / 03:10

3 respostas

5

O shebang nunca faz com que um processo se bifurque. Ele não faz nada a menos que o script seja executável e seja invocado de tal modo que faça com que o sistema avalie o shebang para ver qual programa / shell executar o script com.

Se, por exemplo, você já estava executando o bash e executou o script com o comando source , o script seria executado dentro do shell em execução no momento, e o exit afetaria esse shell processo, em vez de ser um novo processo shell que foi finalizado.

Se você tiver um arquivo de script que deseja executar, torne-o executável com o seguinte comando:

chmod +x script

Em seguida, se você quiser executar o script e assumirmos que o arquivo de script está no diretório atual, use o seguinte comando:

./script

Note que isso é muito diferente de . script , que é apenas uma notação abreviada para source script .

O ./script é um nome de caminho relativo para o arquivo de script, o que significa pesquisar no diretório atual para localizar o script 'script' e executá-lo - o que funciona somente se o arquivo de script for executável.

Se você tiver um arquivo de script que NÃO é executável, invoque-o com:

bash script

Mas, neste caso, você está especificando qual shell será executado e a linha shebang será ignorada.

    
por 14.03.2011 / 03:50
5

Como a origem de um script usando . faz com que ele seja executado no shell atual, um exit faz com que o shell atual seja encerrado. Você pode usar return para retornar de um script originado, bem como de uma função. Você não pode retornar de um script que foi executado diretamente.

Para trabalhar dentro dessas restrições, você pode colocar um teste condicional em seu script para fazer a coisa certa, dependendo se é originado ou executado diretamente.

Como a primeira linha após o shebang:

called=$_

No ponto em que você deseja sair ou retornar:

[[ $called != $0 ]] && exit || return
    
por 14.03.2011 / 05:01
4

O shebang não faz com que um programa bifurque; se os forks do processo dependem ou não de como o script é executado. O fornecimento do script fará com que ele seja executado no intérprete atual e o uso de exec substituirá totalmente o processo atual.

    
por 14.03.2011 / 03:49