Eu sempre declaro a linha shebang #!/bin/bash
no meu script de shell. Recentemente, quando chamei um script que contém uma exit
chamada, ele acabou com o meu terminal. Geralmente, mata o processo bifurcado e retorna ao prompt do meu terminal. Por que poderia ter acontecido que parou o garfo?
EDITAR
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
- Normalmente, invoco o script usando
. script_path
ou através de um link simbólico para o script.
bash
unix
shell-script
Martin
fonte
fonte
Respostas:
O shebang nunca causa um processo de bifurcação. Ele não faz nada, a menos que o script seja executável e é invocado de tal maneira que faz com que o sistema avalie o shebang para ver com qual programa / shell executar o script.
Se, por exemplo, você já estivesse executando o bash e executasse o script com o
source
comando, o script seria executado dentro do shell que você estava executando no momento eexit
afetaria esse processo do shell, em vez de ser um novo shell processo que terminou.Se você possui um arquivo de script que deseja executar, torne-o executável com o seguinte comando:
Então, se você deseja executar o script, e se assumirmos que o arquivo de script está no diretório atual, use o seguinte comando:
Observe que isso é muito diferente de
. script
, o que é apenas uma notação abreviada parasource script
.O
./script
é um nome de caminho relativo ao arquivo de script, o que significa pesquisar no diretório atual para encontrar o arquivo de script 'script' e depois executá-lo - o que funciona apenas se o arquivo de script for executável.Se você tiver um arquivo de script que NÃO seja executável, poderá invocá-lo com:
Mas, neste caso, você está especificando qual shell executar e a linha shebang é ignorada.
fonte
Como o fornecimento de um script usando
.
faz com que ele seja executado no shell atual, umexit
faz com que o shell atual seja encerrado. Você pode usarreturn
para retornar de um script de origem e de uma função. Você não pode retornar de um script que foi executado diretamente.Para trabalhar com essas restrições, você pode colocar um teste condicional em seu script para fazer a coisa certa, dependendo de sua origem ou execução direta.
Como a primeira linha após o shebang:
No ponto em que você deseja sair ou retornar:
fonte
virtualenv
activate
scripts python .[[ $_ != $0 ]] || { echo "This file must be sourced to have any effect."; exit 1; }
[[ "$called"
=
"$0" ]] && exit || return
return 2> /dev/null || exit
[[ ]]
pois a divisão de palavras etc. não ocorre lá.O shebang não causa a bifurcação de um programa; se o processo bifurca-se ou não depende de como o script é executado. O fornecimento do script fará com que ele seja executado no intérprete atual e o uso
exec
substituirá o processo atual por completo.fonte