GNU Bash versão 5.1, WSL, Ubuntu 22.04.3 LTS.
$ bash -version
bash -version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
- Editar
.bashrc
, criar funçãofoo
:
foo() {
echo 'GHOST'
}
salvar e sair
- Fonte
.bashrc
:
. .bashrc
Agora foo
é uma função válida:
type foo
foo is a function
foo ()
{
echo 'GHOST'
}
Ligue
foo()
, ele irá imprimirGHOST
Editar
.bashrc
, remover a função, fonte novamentefoo
como uma função ainda disponível para chamada etype
.Reinicie uma janela de terminal, ela agora deixa de existir.
Claro que isso também acontece quando você renomeia uma função; e você continua chamando a versão antiga enquanto a repete pressionando UP para usar a que está no histórico.
Bug? Recurso? Exploração?
Nem um bug, nem um recurso, nem um exploit, mas simplesmente um resultado lógico de como as coisas funcionam. Sourcing
.bashrc
não é nada especial ou mágico. Ele não recria sua configuração de shell ou reinicia sua sessão. Não é diferente de sourcing de qualquer outro arquivo,.bashrc
é apenas o nome padrão para o arquivo de inicialização do shell, mas mesmo isso pode ser alterado usandobash --rcfile whatever
ou definindoBASH_ENV
para shells não interativos.Então, quando você faz o source
.bashrc
, isso não remove nada, apenas adiciona ao que você já tem. É como ler um livro: depois de ler um livro, ler outro livro não remove o que você aprendeu no primeiro, apenas adiciona a ele. A única diferença real é que, no caso do bash, qualquer coisa no novo arquivo source que contradiga algo no antigo substituirá o antigo. Se, portanto, em vez de excluir,foo()
você adicionasse uma função diferentefoo()
, então esta nova substituiria a antiga.A propósito, isso não é nenhuma forma de cache. Você só tem um processo em execução e diz para ele importar coisas novas. As coisas novas são importadas, qualquer coisa que tenha o mesmo nome nas coisas novas será redefinida para os novos valores, qualquer coisa não mencionada nas coisas novas não será tocada.