Trilha (Linux Tools): Funções em Bash

Hoje, gostaria de mostrar alguns exemplos de funções no Bash do Linux, arquivos que podem ser utilizados e algumas das funções que eu tenho definidas no meu sistema.

  • O que precisamos entender primeiro?

No Linux, o Bash permite trabalhar com funções que são parecidas com os aliases, e podemos nesse caso executar pequenos programas, usando o comando function que é usado para criar uma sequência de rotinas, de comandos, loops, if, while, etc.

  • Formas de se usar o comando function

1º) Primeira forma de se declarar uma função:

~/scripts$ function funcao-comandos() {
> uptime
> date
> }
$ ~/scripts$ funcao-comandos
14:37:13 up 6:58, 1 user, load average: 1,47, 0,80, 0,89
qui 21 mai 2020 14:37:13 -03

2º) Segunda forma de se declarar uma função:

~/scripts$ function funcao-comandos2 { date; uptime; cat /etc/os-release; }$ ~/scripts$ funcao-comandos2
qui 21 mai 2020 14:38:25 -03
14:38:25 up 7:00, 1 user, load average: 1,51, 0,94, 0,93
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

3º) Terceira forma de se declarar uma função (sem o uso do comando function):

$funcao-comandos3() { uptime; uname -v; hostname; } ~/scripts$ funcao-comandos3
14:39:06 up 7:00, 1 user, load average: 1,39, 0,99, 0,95
#35-Ubuntu SMP Thu May 7 20:20:34 UTC 2020
dell-inspiron

Para listar as funções definidas no Bash pode se usar o comando typeset -f

$ typeset -f | grep -i funcao-comandos3
funcao-comandos3 ()

Para remover uma função do Bash pode ser usar o comando unset -f

$ unset -f funcao-comandos3
  • Entendendo alguns arquivos importantes do Linux

Tudo que a gente fez até agora no Bash só vale para essa sessão, temporário, só vale para essa sessão do Bash. Se eu reiniciar essa máquina, ou abrir outra sessão não vai funcionar.

Para que as funções fiquem permanentes no nosso sistema, temos que trabalhar com alguns arquivos, veja esse anexo abaixo:

Arquivos que aplicam configurações para todos usuários.

Entendendo o conceito de login e sessão (toda vez que eu faço o procedimento de login, eu abro um novo terminal, mas nem toda vez que eu abro uma nova sessão, um novo bash, eu não tô fazendo o procedimento de login).

$/etc/profile (utilizado quando se faz o procedimento de login, quando o usuário loga na interface gráfica)

  • é aqui que se inclui um alias para todos usuários, uma função que seja carregada no momento do login.
  • como exemplo, foi definida uma variavel chamada ETCPROFILE=valor2 no /etc/profile.

$/etc/bash.bashrc (aplicado quando se abre um novo terminal, uma sessão do shell) bashrc (novo bash, novo shell).

  • existem várias definições nesse arquivo.
  • declarando a variável BASHRCTESTE=valor2
  • digitando dentro do terminal, $bash ele abre outro shell, digitando $echo $BASHRCTESTE, ele mostra o valor, porque ele abriu outro shell, nova aba tbm serve.

Arquivos que aplicam configurações para um usuário específico, para um usuário individual.

  • existem alguns arquivos no /home de cada usuário para que ele mesmo faça as alterações.
  • “semelhante ao /etc/profile (novo login)”

$~/.bash_profile/
$~/.bash_login/
$~/.profile (definições pessoais que serão aplicadas em todo novo login) — posso adicionar um alias, uma função, uma variável.

  • sempre será nessa ordem, caso não tenha o 1º arquivo, ele segue para o 2º, caso não tenha ele vai para o último (~/.profile)
  • definindo um alias no arquivo /home/.profile alias tt=”date; uptime”

O /home do usuário também tem outros arquivos importantes.

  • $ ~/.bash_logout (o que tem nesse arquivo será executado toda vez que o usuário fizer logout).
  • $ /etc/inputrc (definir comandos no terminal, definir o tipo de edição que o terminal aceita, vim, emacs).
  • $ /etc/skel (diretório no /etc todos os arquivos e diretórios que estão dentro do /etc/skel, vão ser fazer parte da base de novos usuários que serão criados no sistema, os arquivos vão ser colocados no /home do usuário que eu criar).
  • Se eu quiser adicionar uma configuração específica eu posso por no diretório /etc/skel, que ele vai criar para todos os usuários do sistema.
  • Exemplos de funções no Bash

Conforme mencionado, fiquei de mostrar uma função que faz o update no sistema, é bem simples, existem outras formas de se fazer.

function sistema() {
sudo apt update
sudo apt list --upgradable
sleep 2
sudo apt upgrade
}

Basicamente, essa função vai mostrar os updates, pausa por 2 segundos (sleep 2), e depois fica esperando eu enviar o yes (y), para aplicar as atualizações. Essa função adicionei no /etc/bash.bashrc (para todos os usuários do sistema que abrirem um shell novo) e no ~/.bashrc.

Outro exemplo de função, seria:

function diretorios() {
for item in /home/user/*
do
if [ -d "$item" ]
then
echo "user, $item é um diretório!"
sleep 2
else
echo "$item não é diretório!"
fi
done
}

Na função acima, podemos ver que ela verifica no diretório do usuário, o que é diretório, é bem simples, existem mais formas de se melhorar isso, trazendo mais resultados, por exemplo, (Quantos tem? Quantos GB tem em cada diretório? Quantos arquivos tem?; etc).

Agora que você sabe os arquivos que podem ser utilizados para manter as configurações permanentes no Bash, use muito funções, aliases, isso vai deixar seu sistema automatizado.

Isso é tudo pessoal, bem simples! Fiquem a vontade para sugerir melhorias, e se você não curtiu, comente também! #VAIIII

Agradecimentos ao professor de Linux Ricardo Prudenciato! 🚀

Senior Linux Administrator @IBM

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store