EXECUÇÃO DE COMANDOS NO BASH *COMO FUNCIONA*
Este é um post complementar ao vídeo que fiz sobre aumentar a performance de um código em Shell Script.
É de suma importância entender esse conceito para programar e usar o Bash da forma correta. Te confesso que não lembrei disso quando gravei o vídeo, mas agora vai um material complementar.
Importante ressaltar que não é necessário que você decore essas coisas, mas é legal ter uma noção disso e onde buscar informação quando “apertar”. Tudo está no manual do Bash.
A ordem de execução do Bash
1. Validar se existe um slash
Um “slash” é uma barra, seja invertida ou normal. O famoso “/”.
Usamos isso para executar um script que está localmente e que não podemos chamar diretamente no Terminal.
Por exemplo, imagine que criei um diretório chamado dir1. Dentro deste diretório há um script chamado script1.sh que acabei de criar.
Se eu chamar desta forma:
$ script1.sh
Isso não vai funcionar. Eu preciso fazer desta forma (dentro do dir1):
$ ./script1.sh
Então a primeira coisa que o Bash vai olhar é se existe um slash. Se existir, significa que ele não precisa seguir o resto das buscas para encontrar o executável.
2. Validar se existe uma função
Se o Bash identificar que não existe um slash na execução, ele vai procurar uma função com este nome.
Então, seguindo o exemplo anterior, se você chamar desta forma:
$ script1
O bash vai ver que não existe um slash e vai procurar uma função com este nome.
Se eu criasse uma função desta forma:
$ function script1 { ls -la; }
Então eu poderia chamar a função script1 direto no Terminal e ele executaria o meu “ls -la”.
3. Validar se existe um built-in
Se não existir nenhuma função, o Bash vai procurar por um built-in. Um built-in é um comando que está contido dentro do Bash e não possui uma dependência externa.
O comando “type” por exemplo é um built-in. O comando “ulimit” também.
Se não existir um built-in, o Bash parte para a última alternativa que é tentar encontrar o executável.
4. Procurar o executável
O bash faz então uma busca pelo nome do executável dentro da variável PATH que mantém todos os diretórios de executáveis do sistema.
Este é um exemplo da minha variável:
/home/mateus/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Ela é um hash separado por “:”. O bash vai procurar em cada um desses diretórios se existe um “script1” lá (seguindo o exemplo anterior).
Caso não seja encontrado nada, o bash segue fazendo o tratamento de erros. Caso seja encontrado ele inicia a execução, que é a parte mais importante.
O ambiente de execução
Se o executável é encontrado dentro da variável PATH, o bash cria uma nova sessão para executar, chamada de execution environment.
Esse ambiente de execução possui algumas particularidades herdadas da sessão pai:
- Arquivos abertos
- O diretório corrente
- O umask
- Variáveis e funções exportadas
- Traps
É importante entender que sempre que o executável não é um bash built-in ou uma função, ele vai criar uma sessão de bash nova para cada execução do comando. Isso afeta muito o desempenho quando usamos toneladas de dados. Você pode validar isso no vídeo que coloquei no começo do artigo.
Por conta disso é sempre recomendável usar funções nativas do Bash no seu script.
Bom, espero que você tenha gostado dessas dicas e que você realmente usufrua delas!
Me siga no Instagram onde eu faço conteúdos da minha rotina diária.
Participe dos nossos grupos no Telegram e Facebook! 🙂
Se tiver alguma dúvida ou sugestão de conteúdo, por favor, comente!