Atualmente, estou executando vários scripts no Debian 12.X com o seguinte bash:
GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
Tenho os seguintes métodos/opções para executar o script.
Cada método tem os seguintes impactos ou opções:
Method | New Process | Shell Ends with exit | Variables Persist |
------------------------------------------------------------------------
./script | YES | NO | NO |
------------------------------------------------------------------------
bash script | YES | NO | NO |
------------------------------------------------------------------------
. ./script | NO | YES | YES |
------------------------------------------------------------------------
source script | NO | YES | YES |
------------------------------------------------------------------------
@terdon
Note que . ./script e source script são exatamente a mesma coisa. O comando padrão é . e o bash também oferece o sinônimo source, mas não há diferença entre os dois além do nome.
Dependendo do método que eu uso para iniciar o script e depois encerrá-lo, posso reutilizar diferentes variáveis e opções ou não no shell atual ou na sessão de terminal, se elas não forem encerradas/fechadas/efetuadas logout .
Se eu executar o script com ./script
ou bash script
, uma nova instância do shell será iniciada, e as variáveis de ambiente definidas dentro dela serão válidas somente nessa instância.
Após o término do script, essas variáveis são perdidas.
Entretanto, se eu executar o script com . ./script
, as variáveis permanecerão na sessão do shell pai porque elas afetam diretamente o shell atual.
Nesse caso, saber se as variáveis persistirão na sessão pai é crucial se eu quiser que elas estejam disponíveis pelo resto da sessão sem redefini-las manualmente.
Também posso decidir, por exemplo, se o script termina com exit ou return e, dependendo disso, se ocorre um logout ou se o shell é fechado.
Então, isso influencia outras etapas posteriores.
Posso detectar no script como ele foi iniciado de forma simples e fácil, ou seja, qual método foi usado para armazenar um valor em uma variável e depois processá-lo sem passar parâmetros na inicialização?
Como definir um script de shell para ser originado e não executado aborda a parte principal da sua pergunta — não a estou fechando como duplicada, no entanto, porque ela não a aborda literalmente.
No Bash, você pode distinguir entre executar e obter um script comparando a
BASH_SOURCE
matriz e$0
:Supondo que seu script especifique Bash em seu shebang, não acho que haja uma maneira de distinguir
./script
debash script
, mas como ambos se comportam da mesma forma no que diz respeito à sua tabela, não deve ser um problema.