Uma breve introdução ao GNU/Linux

Leonel Marcos
12 min readJul 7, 2024

--

Introdução

Para a maioria das pessoas, Linux é sinônimo de complexidade, um sistema operacional estranho que só funciona por linha de comando. Terminais pretos e letras verde piscando enquanto caracteres pulam na tela freneticamente. Mas não é bem assim.

Hoje em dia a maioria das distribuições Linux possuem interfaces gráficas e são amigáveis ao usuário comum. Grandes exemplos disso são o Ubuntu e o Linux mint.

tela inicial do Ubuntu
tela inicial do Mint

Porém, se você não estiver satisfeito com o pacote de interface gráfica padrão de uma distribuição, você pode simplesmente o desinstalar, substituir por outro, ou modificar e personalizar à vontade até que esteja com a sua cara. E é aí, que reside o poder do Linux. Você controla o sistema, não o contrário.

Afinal, o que é GNU/Linux?

Apesar de ser usado para se referir aos sistemas operacionais que o utilizam, Linux se trata de um Kernel. Kernel, que significa núcleo, é o responsável por fazer a ponte entre um sistema operacional e o hardware — parte física do computador — , não sendo exclusivo aos sistemas do tipo Unix, por exemplo, o Windows também possui um Kernel, chamado Windows NT ou NT Kernel.

E o que é GNU? Bom, um núcleo não funciona por conta própria, mas sim aloca e gerencia os recursos para que outros programas funcionem. Comumente descrito dessa forma, o Linux preencheu a lacuna que faltava para o projeto GNU, fundado por Richard Stallman como parte do Movimento de Software Livre, cujo objetivo era criar um sistema, parecido com o Unix, mas que fosse livre e gratuito. Quando falamos de GNU, estamos falando de uma gama de softwares que integram o sistema como um todo. Exemplificando, entre outros programas que pertencem ao projeto GNU, estão o GRUB (GRand Unified Bootloader), bash, grep, tar, gzip, e o GNOME, que surgiu como uma interface gráfica para ajudar usuários que não são especialistas.

A partir da junção GNU/Linux, são desenvolvidos as distribuições que conhecemos, como Mint, Ubuntu, Debian, CentOS, e muitas outras. São sistemas operacionais, que nasceram do núcleo Linux e, da visão e softwares do projeto GNU. Modificados e distribuídos, vindo com diferentes programas pré-instalados, gerenciadores de pacotes, ambientes desktop, etc.

Uma curiosidade, o nome Linux — em homenagem ao seu criador Linus Torvalds -, é um acrônimo recursivo para Linux is not unix. Assim como GNU é um acrônimo recursivo para GNU is Not Unix.

A estrutura de uma distro Linux

Uma distribuição Linux, na sua essência, tem seus diretórios organizados da seguinte forma:
/, éa raíz do sistema, a partir desse ponto de montagem, estarão todas as outras pastas e subpastas. Se formos comparar com o Windows, se assemelha ao C:\;
/bin, é onde estão os programas, ou binários, essenciais para o sistema;
/boot, onde estão configurações e arquivos necessários para inicialização do sistema, como o GRUB. Também é onde está localizado uma imagem do Kernel;
/dev, diretório onde estão arquivos, que servem como interface, para acessar ou gerenciar qualquer dispositivo conectado ao seu computador;
/etc, aqui ficam arquivos de configuração do sistema e outros serviços;
/home, destinado aos usuários para suas pastas pessoais. Por exemplo, /home/joãozinho;
/lib, diretório onde estão localizadas bibliotecas do sistema, utilizadas pelos programas em /bin e módulos do Kernel;
/mnt, usualmente usado como ponto de montagem para dispositivos, como, por exemplo, pen drives;
/proc, informações sobre o Kernel e processos em execução;
/opt, geralmente, usado para pacotes “opcionais”, que não vem com o Linux;
/root, diretório dos superusuários;
/sbin, arquivos essenciais e utilitários para administração do sistema;
o, arquivos temporários;
/usr, contém arquivos e aplicações utilizados pelos usuários, e não todo o sistema;
/var, onde ficam guardados informações variáveis, como logs.

Em sistemas Unix-like, tudo é um arquivo

Como mencionado, dispositivos físicos, e até mesmo, sessões de terminal são listadas em /dev. Isso, porque, no Linux, tudo é um arquivo. Isso pode parecer um pouco estranho, à primeira vista. Mas essa filosofia foi adotada pelo próprio Linus Torvalds, e, se formos parar para pensar, é verdade, para um computador tudo são apenas bytes empilhados, a forma como esses bytes são interpretados é que difere.

Conhecendo o Bash

Não importa se você é um desenvolvedor, ou apenas um entusiasta, aprender a usar um terminal é essencial para aqueles que querem mais controle sobre o sistema. No Windows, temos o prompt de comando e o powershell. Em distribuições Linux, temos terminais como zsh e o bash.

Essa é a carinha de um shell ❤

1. O usuário conectado aquele terminal;
2. O hostname, ou seja, o nome da máquina;
3. O diretório atual (nem sempre estará presente);
4. O tipo do usuário, $ para usuários comuns, # para super-usuários (veremos mais sobre a seguir);

Comandos básicos

Lembre-se, comandos são case-sensitive, isso significa que PWD é diferente de pwd. Aqui vão alguns exemplos de comandos básicos e nativos:

pwd:
Exibe o diretório em que você está localizado, no momento;

cd:
Navega para outro diretório, passado como parâmetro, pode-se utilizar caminhos relativos ou absolutos. Se nenhum for especificado, navega até a pasta definida na variável de ambiente $HOME;

ls:
Lista todos os arquivos no diretório atual, ou no diretório especificado, se nenhum for especificado, utiliza a pasta atual.
Parâmetros comuns:
-l: lista detalhadamente especificando permissões de acesso, quantidade de arquivos, dono e grupo, tamanho em bytes, data de modificação e nome do arquivo.
-a, --all: lista também pastas e arquivos ocultos (iniciam-se com um ., como .env)

output do comando ls -la

Vale ressaltar que, as duas primeiras entradas se referem à pasta atual, e a pasta anterior. E, apesar do nome, o último arquivo listado não é uma pasta, de fato. Pastas, assim como . e .., podem ser identificadas pela letra d (de directory), que vem logo no ínicio do output precedendo as permissões (veremos mais à respeito de permissões a seguir, quando falarmos sobre os comandos chown e chmod).

mkdir: cria uma pasta no caminho especificado. Se não for especificado, a pasta é criada no diretório atual;

echo:
Exibe o valor passado como argumento. Faz mais sentido usado com redirecionamento (veremos adiante);

output do comando echo

No primeiro exemplo, o valor que passamos como argumento é exibido direto na tela. No segundo, utilizamos um condutor para que o output seja escrito no arquivo my_hello.txt

cat:
Exibe o conteúdo de um arquivo;

output do comando cat

grep:
Faz uma “busca” e exibe apenas as entradas que correspondem ao padrão estabelecido;

output do comando grep, buscando por quaisquer arquivos ou pastas que contenham my_

Como podemos ver acima, passamos o output de ls através do uso de um condutor (veremos mais a seguir) para o comando grep. O padrão de busca “my_” fez com que o resultado final exibido na tela fosse somente de arquivos ou pastas que contenham essa expressão, como destacado em vermelho. Podemos conduzir o output de qualquer comando para essa filtragem do grep.
Uma outra forma de utilizar o grep, dessa vez buscando em um arquivo de texto:

output do comando grep, redirecionando para stdout

Nesse exemplo, estamos buscando por Lorem ipsum no arquivo lorem_ipsum.txt — note que, eu precisei encapsular a expressão com aspas, isso por causa do espaço.Esse comando por si só, não exibiria nada na tela, por isso estamos redirecionando o output para /dev/stdout (lembre-se da filosofia de que tudo é um arquivo), ou seja a saída padrão de dados — nesse caso, o terminal atual. Não se preocupe veremos mais sobre a seguir.

output do mesmo comando sem encapsular expressão buscada com aspas por causa do espaço

O comportamento acima ocorre porque o espaço é um delimitador. Dessa forma, ipsum está sendo interpretado como um segundo argumento e não como parte do primeiro que é a expressão buscada. Vamos analisar outros casos.

output do comando grep ao buscar por “&” que é um caractere especial

Não temos o resultado esperado. Por quê?
Porque & é um condutor que manda o processo atual rodar no background. De novo, não se preocupe tanto com isso agora.
Certo, e como fazemos para buscar por &? Simples, coloque-o entre aspas ou escape o caractere utilizando \. Alguns exemplos:

escapando caracteres

Parâmetros interessantes e comuns:
-i, --ignore-case: torna a busca case-insensitive;
-B, --before-context: define uma “margem” de linhas antes do padrão buscado que devem ser retornadas;
-A, --after-matcha: define uma “margem” de linhas depois do padrão buscado que devem ser retornadas;
-C: define uma “margem” de linhas depois e antes do padrão buscado que devem ser retornadas;
-v, --invert-match: reverte a busca, retornando tudo que não atingir o padrão.
Consulte o manual para mais, grep é um comando muito poderoso.

find:
Usado para encontrar arquivos em uma hierarquia de diretórios;

Parâmetros interessantes e comuns:
--exec: executa comandos com base na busca;
--iname: torna a busca case-insensitive;
--regex: utiliza expressões regulares para busca;
--iregex: como — regex, mas case-insensitive;
--size: arquivo utiliza mais que, menos que ou exatos bytes de espaço. utiliza-se - para menos que, + para mais que e nenhum sinal para tamanho exato. É possível especificar também a unidade passando como argumento logo após o tamanho, c para bytes, k para kilobytes, M para megabytes e G para gigabytes.
--atime: encontra arquivos acessados mais que ou menos que n*24. Por exemplo, atime +1 encontrará arquivos acessados a pelo menos dois dias atrás;
Consulte o manual para mais, find é um comando muito poderoso;

touch:
Toca um arquivo atualizando a última modificação. Se o arquivo não existir, ele é criado;

tocando um arquivo no shell

sudo:
Permite executar um comando como se fosse o superusuário (root) ou um outro usuário. Vale ressaltar que, para que funcione o usuário deve ter permissão necessária, localizada no arquivo /etc/sudoers;

executando um shell interativo como root
utilizando o parâmetro su para interpretar o usuário l30 na sessão interativa como root
utilizando sudo para conseguir rodar um comando

cp:
Copia um arquivo;

copiando um arquivo com cp

mv:
Move um arquivo;

movendo um arquivo com mv

rm:
Deleta um arquivo ou diretório, se usado com o argumento de recursão -r;

utilizando rm para remover arquivos e pastas

ps:
Exibe os processos em execução;

exemplo de uso do comando ps

No exemplo acima, utilizamos primeiro o formato mais simples. E em seguida, fazemos uso dos parâmetros a, u e x para listar todos os processos do sistema com mais detalhes e, inclusive aqueles não associados à um terminal, daemons e processos rodando no background.

kill:
“Mata” um processo sendo executado, enviando sinais de interrupção para o mesmo. Se o processo ignorar esses sinais, é possível forçar utilizando o argumento -9. Exemplo de uso:

kill -9 PID_DO_PROCESSO

chown:
Altera o “dono” ou “grupo detentor” de um arquivo ou pasta;

alterando o dono de l30 para root
alterando também grupo detentor do arquivo

chmod:
Altera as permissões de um arquivo ou pasta;

referência permissões output de ls -l

Acompanhe a imagem acima, as permissões podem ser divididas em três grupos de três caracteres, que podem ser r (leitura), w (escrita) ou x (execução). Sendo o primeiro grupo referente ao dono do arquivo, o segundo do grupo detentor e o terceiro de qualquer usuário no sistema. Da mesma forma, dê uma olhada na tabela no canto inferior direito. Cada permissão tem sua “pontuação”, e diferentes permissões são a soma desses pontos. Para utilizar o comando chmod utiliza-se a sintaxe chmod permissões arquivo/pasta. Ou seja, se eu quiser dar todas as permissões para todos os usuários eu posso fazer:

atualizando permissões para todos os usuários

Ou, com um pouco mais de controle:

atualizando permissões para todos os usuários usando sistema de pontuação

O primeiro sete se refere ao dono, o segundo ao grupo, o terceiro a qualquer outro usuário.

Ok, agora eu quero que o dono possa ler, escrever e executar. O grupo dono possa executar e qualquer outro usuário somente ler:

E, por último, suponha que eu quero que o dono possa fazer tudo, mas os outros usuários não possam fazer nada:

erro de leitura, ao tentar ler com usuário comum

alias:
Dá um “apelido” para um ou mais comandos, como se fosse uma variável. É muito útil quando você se vê repetindo uma série de comandos frequentemente. Por exemplo, suponha que você trabalhe como desenvolvedor(a) e toda manhã precisa executar os seguintes comandos para preparar o seu ambiente.
cd ~/Personal/myApps/ && yarn start && cd .. && cd /myOtherApps && source .
Utilizando o alias, você pode jogar isso tudo para dentro de um “apelido”, e executar todos esses comandos, apenas digitando ele no seu terminal. Mas lembre-se, alias só funciona para o terminal atual, mais interessante seria salvar no .bashrc (que fica localizado na pasta pessoal de um usuário, ou seja, a $HOME), o que faria disponível para todos os terminais abertos por aquele usuário no futuro;

alguns exemplos de uso do alias, definidos no .bashrc do usuário

man:
Exibe o manual de um programa. Muito útil para descobrir como e porquê se utiliza determinado comando.

Há muitos outros comandos, não só do Bash, mas também de serviços e aplicativos externos em sua versão CLI (Command Language Interface). Muitos deles, oferecem a opção -h ou — help (dois hífens, medium transforma em um travessão), lembre-se que você também pode usar o comando man nome_do_comando, para exibir o manual com ainda mais informações. Algumas ferramentas também possuem uma documentação online. E além disso, como sempre digo, o Google é seu amigo, não tenha medo de pesquisar.

Clique aqui, para um compilado de comandos úteis do bash

Redirecionamento e condutores

Sendo simplista, o redirecionamento permiti que os processos se comuniquem, e a manipulação de dados se dê mais facilmente. Os operadores são:
|, pipe: Usa o output de um comando como input para outro;

exemplo de uso do pipe

&, execução em background: Executa o processo em background, liberando o terminal para novos comandos;

exemplo da execução em background, retorno é o PID do processo sendo executado em bg

||, operador lógico “ou”: executa o próximo comando, apenas se o anterior falhar;

exemplo de uso do operador OU

&&, operador lógico “e”: executa o próximo comando apenas se o anterior tiver êxito;

exemplo de uso do operador E

>, redirecionamento de saída: Redirecionador, sobrescreve com output do programa;

exemplo de uso de redirecionamento de saída padrão

>>, redirecionamento de saída — append: Redireciona acrescentando output do programa, se estiver redirecionando para um arquivo não sobrescreve o conteúdo, mas sim acrescenta ao final;

exemplo de uso do redirecionamento de saída append

;, delimitador de comandos: é possível encadear comandos utilizando o ponto e vírgula.

Fluxos de dados padrão

/dev/ stdout: saída de dados padrão, representado pelo número 0;
/dev/ stdin: entrada de dados padrão, representado pelo número 1;
/dev/ stderr: saída de erros, representado pelo número 2;

Então, por exemplo. Se eu quiser pegar somente os erros de determinado comando e salvar em um arquivo eu poderia o fazer:

comando 2> arquivo_erro.log

Agora, se eu quiser abstrair todo e qualquer erro, eu posso redirecionar o stderr para /dev/null, que é basicamente um buraco negro, esse arquivo especial descarta toda e qualquer informação enviada para ele, não retornando para lugar nenhum.

comando 2> /dev/null

Concluindo

Por mais longo que tenha sido esse artigo, essa é a ponta do iceberg, mas não se sinta sobrecarregado. O que quero dizer com isso é que distribuições GNU/Linux te dão todo o poder que você precisa para que você possa operar sua máquina. Seja você um usuário comum, avançado, um entusiasta ou desenvolvedor, um hacker ou alguém preocupado com sua privacidade. É possível encontrar uma distro que atenda as suas preferências, que seja de fácil uso diário (como mint ou ubuntu) ou um bicho de sete cabeças (arch linux), que venha com um set de programas de pentest (kali ou parrotsec) ou que não venha com nenhum e te deixe escolher desde o início o que quer e precisa (como o arch linux, novamente 😅). Que te permita navegar anonimamente e apague tudo assim que a sessão encerrar (como tails). E mesmo se não houver, é possível personalizar, modificar ou até criar uma.

Refs e links que podem vir a calhar

Manual do Bash
Linux commands cheatsheet
Distrochooser
Condutores e fluxos de dados no Linux
Automating tasks with cron jobs

--

--

Leonel Marcos

Desenvolvedor full-stack, arteiro multimídia, tatuador nas horas vagas e aspirante a escritor.