Se você trabalha com desenvolvimento de software, aprender Linux pode ser uma das habilidades mais importantes para ampliar seus conhecimentos técnicos.
Mesmo que você utilize Windows ou macOS como sistema operacional principal, provavelmente já teve contato com ambientes Linux em servidores, containers Docker, máquinas virtuais, serviços em cloud ou pipelines de CI/CD.
O Linux está presente em uma grande parte da infraestrutura utilizada atualmente para executar aplicações, hospedar APIs, administrar bancos de dados e disponibilizar serviços na internet.
Para desenvolvedores .NET, por exemplo, conhecer Linux pode facilitar bastante o trabalho com Docker, ASP.NET Core, Azure, AWS e ambientes de produção.
Mas existe uma dúvida comum para quem está começando: por onde devo começar? Preciso aprender todos os comandos? É necessário abandonar o Windows e utilizar Linux diariamente?
A resposta é não.
Você não precisa se tornar um administrador de sistemas para aproveitar os benefícios do Linux. Entretanto, dominar alguns conceitos e comandos fundamentais pode tornar seu trabalho muito mais produtivo.
Neste artigo, vamos apresentar os principais conceitos, mostrar como preparar um ambiente de aprendizado e conhecer os comandos Linux que todo desenvolvedor deveria dominar.
Durante o desenvolvimento de software, nem sempre trabalhamos exclusivamente no ambiente local.
Uma aplicação pode ser desenvolvida no Windows, executada em containers Linux, hospedada em uma máquina virtual na AWS e monitorada por ferramentas disponíveis em um servidor remoto.
Conhecer Linux ajuda a compreender melhor todo esse fluxo.
Entre os principais benefícios estão:
Administrar servidores e ambientes remotos.
Trabalhar com containers Docker.
Investigar problemas em aplicações hospedadas em Linux.
Automatizar tarefas utilizando scripts.
Gerenciar arquivos e permissões.
Trabalhar com ferramentas de DevOps.
Compreender melhor ambientes de cloud computing.
Executar aplicações e serviços diretamente no sistema operacional.
Outro ponto importante é que muitas ferramentas utilizadas no desenvolvimento moderno possuem suporte nativo ao Linux.
Docker, Git, .NET, Python, Node.js, PostgreSQL e diversas outras tecnologias podem ser utilizadas nesse ambiente.
Para quem trabalha com desenvolvimento backend, infraestrutura ou arquitetura de software, esse conhecimento representa uma vantagem importante.
Uma das primeiras decisões para quem deseja aprender Linux é escolher uma distribuição.
Uma distribuição, também conhecida como distro, é um sistema operacional baseado no kernel Linux, acompanhado de ferramentas, bibliotecas, gerenciador de pacotes e outros componentes.
Existem diversas opções disponíveis, mas algumas são especialmente interessantes para desenvolvedores.
Uma das distribuições mais populares, com documentação extensa, grande comunidade e ampla compatibilidade com ferramentas de desenvolvimento.
Boa escolha para aprender terminal, Docker e desenvolvimento backend.
Uma distribuição moderna, interessante para quem deseja trabalhar com tecnologias recentes e conhecer um ambiente Linux bastante utilizado por desenvolvedores.
Possui uma interface familiar para quem está migrando do Windows e oferece uma experiência bastante amigável para iniciantes.
Conhecido pela estabilidade e bastante utilizado em servidores. É uma boa opção para compreender ambientes Linux voltados à infraestrutura.
Não existe uma distribuição obrigatoriamente melhor para todos os desenvolvedores.
Para começar, minha sugestão é utilizar Ubuntu. Além da facilidade de aprendizado, muitos tutoriais, ferramentas e exemplos disponíveis na internet utilizam essa distribuição como referência.
Você não precisa formatar seu computador ou substituir seu sistema operacional atual para começar a aprender Linux.
Existem algumas alternativas interessantes.
O Windows Subsystem for Linux (WSL) permite executar um ambiente Linux diretamente no Windows, sem precisar configurar uma máquina virtual tradicional.
Com o WSL 2, é possível executar distribuições Linux em um ambiente baseado em uma máquina virtual leve, com integração ao Windows.
É uma alternativa bastante interessante para desenvolvedores que trabalham com Windows 10 ou Windows 11.
A instalação pode ser realizada pelo PowerShell, quando o recurso estiver disponível e autorizado no computador:
wsl --install
Depois, é possível instalar uma distribuição compatível e acessar seu terminal diretamente pelo Windows.
Vale observar que computadores corporativos podem possuir restrições administrativas que impedem a instalação ou ativação do WSL.
Outra possibilidade é utilizar uma máquina virtual com Ubuntu ou outra distribuição.
Ferramentas de virtualização permitem executar Linux em uma janela, mantendo o Windows como sistema principal.
Essa alternativa oferece maior isolamento entre os sistemas, mas exige recursos adicionais de memória e processamento.
Se seu objetivo principal é trabalhar com containers, Docker também pode ser uma alternativa para experimentar ambientes Linux.
Entretanto, é importante entender que um container não representa uma máquina virtual completa. Ele compartilha o kernel do sistema operacional hospedeiro ou da infraestrutura de containers.
Para aprender Linux de maneira mais abrangente, recomendo começar com WSL ou uma máquina virtual.
Antes de começar a executar comandos, é importante compreender como os arquivos são organizados.
Diferentemente do Windows, que normalmente utiliza unidades como C: e D:, o Linux organiza seu sistema de arquivos a partir de uma estrutura hierárquica que começa na raiz /.
Alguns diretórios importantes:
|
Diretório |
Finalidade |
|---|---|
|
|
Diretório raiz do sistema |
|
|
Diretórios pessoais dos usuários |
|
|
Arquivos de configuração |
|
|
Dados variáveis, incluindo logs |
|
|
Arquivos temporários |
|
|
Programas, bibliotecas e recursos |
|
|
Aplicações e softwares adicionais |
|
|
Comandos essenciais do sistema |
|
|
Diretório pessoal do usuário root |
Um exemplo:
/
├── home
│ └── developer
│ ├── projects
│ └── documents
├── etc
├── var
│ └── log
├── tmp
├── usr
└── opt
Imagine que você está desenvolvendo uma API e deseja organizar seus projetos dentro do diretório pessoal.
Poderia utilizar:
cd /home/developer
mkdir projects
cd projects
Essa estrutura é bastante comum em ambientes Linux.
Um detalhe importante: nomes de arquivos e diretórios são sensíveis a maiúsculas e minúsculas. Portanto, Projects e projects podem representar diretórios diferentes.
Vamos começar pelos comandos que você utilizará praticamente todos os dias.
O comando pwd mostra o diretório atual.
pwd
Resultado:
/home/developer/projects
É especialmente útil quando estamos trabalhando com diferentes diretórios e precisamos confirmar nossa localização.
Para visualizar o conteúdo de um diretório:
ls
Algumas variações importantes:
ls -l
Exibe informações detalhadas, como permissões, proprietário, tamanho e data.
ls -a
Mostra também arquivos ocultos.
ls -lah
Combina informações detalhadas, arquivos ocultos e tamanhos em formato mais legível.
Para acessar um diretório:
cd projects
Para voltar ao diretório anterior:
cd ..
Para acessar diretamente seu diretório pessoal:
cd ~
Para retornar ao diretório anterior:
cd -
Esses comandos parecem simples, mas representam a base da utilização do terminal Linux.
Outro grupo de comandos essencial está relacionado à criação, movimentação, cópia e remoção de arquivos.
|
Comando |
Finalidade |
|---|---|
|
|
Criar diretórios |
|
|
Criar arquivos vazios ou atualizar timestamps |
|
|
Copiar arquivos |
|
|
Mover ou renomear arquivos |
|
|
Remover arquivos |
|
|
Remover diretórios vazios |
Vamos observar alguns exemplos.
mkdir my-project
Também podemos criar diretórios aninhados:
mkdir -p projects/api/src
touch README.md
cp appsettings.json backup/
Para copiar um diretório e seu conteúdo:
cp -r my-project my-project-backup
mv config.json backup/
Para renomear:
mv old-name.txt new-name.txt
rm temporary-file.txt
Para remover um diretório e seu conteúdo:
rm -r old-project
O comando rm -r pode remover permanentemente arquivos e diretórios. Verifique sempre o caminho antes de executar. Evite utilizar rm -rf sem compreender exatamente o que será removido.
Desenvolvedores frequentemente precisam investigar arquivos de configuração, logs e resultados de execução.
O Linux possui ferramentas bastante eficientes para isso.
cat appsettings.json
É útil para arquivos pequenos.
less application.log
Permite navegar pelo conteúdo sem carregar tudo visualmente de uma só vez.
Para sair, pressione q.
head -n 20 application.log
Exibe as primeiras 20 linhas.
tail -n 20 application.log
Um dos usos mais interessantes é acompanhar logs em tempo real:
tail -f application.log
Esse comando é especialmente útil quando estamos investigando problemas em uma aplicação.
Imagine que você deseja localizar todas as linhas que contêm a palavra ERROR:
grep "ERROR" application.log
Para ignorar diferenças entre maiúsculas e minúsculas:
grep -i "error" application.log
Para pesquisar recursivamente em diretórios:
grep -r "ConnectionString" ./config
O grep é uma ferramenta extremamente útil para localizar mensagens, configurações e informações em projetos.
Para procurar um arquivo pelo nome:
find . -name "*.cs"
Para localizar arquivos de configuração:
find . -name "appsettings*.json"
Esses comandos podem economizar bastante tempo durante a manutenção de aplicações.
Um dos conceitos mais importantes do Linux é o sistema de permissões.
Cada arquivo ou diretório possui permissões que determinam quem pode ler, modificar ou executar determinado recurso.
As permissões básicas são:
|
Permissão |
Significado |
|---|---|
|
r |
Read — leitura |
|
w |
Write — escrita |
|
x |
Execute — execução |
Podemos visualizar essas permissões utilizando:
ls -l
Exemplo:
-rwxr-xr-- 1 developer developer 1200 script.sh
Nesse exemplo, temos permissões diferentes para o proprietário, o grupo e os demais usuários.
Imagine que você criou um script e deseja permitir sua execução:
chmod +x deploy.sh
Agora o arquivo possui permissão de execução para as categorias às quais a permissão foi concedida.
Também podemos utilizar permissões numéricas:
chmod 755 deploy.sh
O valor 755 representa:
Proprietário: leitura, escrita e execução.
Grupo: leitura e execução.
Outros usuários: leitura e execução.
Para modificar o proprietário de um arquivo:
sudo chown developer:developer deploy.sh
O comando altera o proprietário e o grupo do arquivo, conforme os usuários e grupos existentes no sistema.
O comando sudo permite executar determinadas operações com privilégios administrativos, conforme as permissões configuradas para o usuário.
Exemplo:
sudo apt update
É comum utilizá-lo para instalar programas, atualizar pacotes e modificar configurações do sistema.
Entretanto, não utilize sudo indiscriminadamente.
Um comando executado com privilégios administrativos pode modificar arquivos críticos, alterar configurações de segurança ou remover componentes importantes.
Sempre entenda o que está executando antes de conceder privilégios elevados.
Diferentemente do Windows, onde frequentemente baixamos instaladores individuais, muitas distribuições Linux utilizam gerenciadores de pacotes.
Essas ferramentas permitem instalar, atualizar e remover programas por meio do terminal.
Os comandos variam de acordo com a distribuição.
|
Distribuição |
Gerenciador |
Exemplos |
|---|---|---|
|
Ubuntu / Debian |
APT |
|
|
Fedora |
DNF |
|
|
Arch Linux |
Pacman |
|
No Ubuntu, podemos atualizar a lista de pacotes disponíveis:
sudo apt update
Para atualizar os pacotes instalados:
sudo apt upgrade
Para instalar o Git:
sudo apt install git
Para instalar o curl:
sudo apt install curl
Para remover um pacote:
sudo apt remove nome-do-pacote
Uma recomendação importante é priorizar os repositórios oficiais da distribuição ou as fontes oficiais dos projetos.
Evite executar comandos encontrados aleatoriamente na internet sem compreender seu funcionamento.
Agora chegamos a uma parte especialmente interessante para quem trabalha com desenvolvimento de software.
Além dos comandos básicos, existem ferramentas que ajudam a administrar serviços, verificar conexões, trabalhar remotamente e investigar problemas.
Para listar processos em execução:
ps aux
É possível filtrar resultados utilizando grep:
ps aux | grep dotnet
Esse exemplo ajuda a localizar processos relacionados ao .NET.
top
Permite acompanhar processos e consumo de recursos, como CPU e memória.
free -h
Mostra informações sobre a memória física e swap em formato legível.
df -h
Muito útil quando uma aplicação começa a apresentar problemas relacionados ao armazenamento.
du -sh ./logs
Mostra o espaço ocupado pelo diretório de logs.
Para desenvolvedores backend, esse comando é particularmente importante.
Podemos testar um endpoint de uma API:
curl https://localhost:5001/api/orders
Para enviar uma requisição POST com JSON:
curl -X POST https://localhost:5001/api/orders \
-H "Content-Type: application/json" \
-d '{"customerId": 10}'
Em ambientes com certificado local de desenvolvimento não confiável, a validação TLS pode impedir a chamada. A opção -k desabilita essa validação e deve ser reservada a testes locais controlados, nunca como solução permanente para conexões reais.
O SSH permite estabelecer conexões remotas seguras com outros computadores.
Exemplo:
ssh developer@192.168.1.100
É uma ferramenta fundamental para quem trabalha com servidores Linux, máquinas virtuais e infraestrutura cloud.
Para copiar um arquivo local para um servidor:
scp application.zip developer@192.168.1.100:/home/developer/
Para copiar um arquivo do servidor para sua máquina:
scp developer@192.168.1.100:/home/developer/application.log .
Para criar um arquivo compactado:
tar -czvf backup.tar.gz ./my-project
Para extrair:
tar -xzvf backup.tar.gz
É uma ferramenta bastante utilizada em processos de backup e transferência de arquivos.
Quando começamos a administrar aplicações em servidores Linux, precisamos aprender a trabalhar com serviços.
Muitas distribuições utilizam systemd como sistema de inicialização e gerenciamento de serviços.
Nesses ambientes, o comando systemctl permite consultar e administrar serviços.
systemctl status nginx
sudo systemctl start nginx
sudo systemctl restart nginx
sudo systemctl enable nginx
Esses exemplos utilizam o Nginx, mas os comandos podem ser aplicados a outros serviços gerenciados pelo systemd.
Para consultar logs:
journalctl -u nginx
Para acompanhar novas mensagens:
journalctl -u nginx -f
Imagine que você publicou uma API ASP.NET Core em um servidor Linux e ela está apresentando erros durante a inicialização.
Consultar os logs do serviço pode ajudar a identificar problemas de configuração, dependências ou conexão com recursos externos.
Atenção: systemctl e journalctl dependem de um ambiente que utiliza systemd. Nem todo container ou distribuição utiliza esse modelo.
Um dos recursos mais interessantes do terminal Linux é a possibilidade de combinar diferentes comandos.
O símbolo |, chamado de pipe, permite encaminhar a saída de um comando para a entrada de outro.
Imagine que você deseja localizar erros em um arquivo de log e contar quantas ocorrências foram encontradas.
grep "ERROR" application.log | wc -l
Nesse exemplo:
grep localiza as linhas contendo ERROR.
O pipe encaminha o resultado.
wc -l conta as linhas recebidas.
Outro exemplo:
ps aux | grep dotnet
Aqui, listamos os processos e filtramos aqueles relacionados ao .NET.
Também podemos redirecionar a saída para um arquivo:
ps aux > processes.txt
O operador > cria ou substitui o conteúdo do arquivo de destino.
Já o operador >> acrescenta conteúdo ao final:
echo "Application started" >> application.log
Esses recursos são fundamentais para criar scripts e automatizar tarefas.
Para quem trabalha com C# e .NET, aprender Linux pode trazer benefícios bastante concretos.
A plataforma .NET possui suporte para Linux, permitindo desenvolver, compilar e executar aplicações nesse ambiente.
Vamos considerar alguns exemplos.
dotnet --version
Para consultar os SDKs instalados:
dotnet --list-sdks
Para consultar os runtimes:
dotnet --list-runtimes
dotnet new webapi -n MyLinuxApi
Acessar o diretório:
cd MyLinuxApi
Restaurar dependências:
dotnet restore
Compilar:
dotnet build
Executar:
dotnet run
A aplicação será iniciada conforme as configurações do projeto.
Outra aplicação interessante é utilizar Linux como ambiente para executar containers.
Imagine que você possui uma API ASP.NET Core e deseja construir uma imagem Docker:
docker build -t mylinuxapi .
Para executar um container:
docker run -d -p 8080:8080 mylinuxapi
O mapeamento de portas deve corresponder à porta configurada pela aplicação dentro do container.
Com esse conhecimento, você consegue desenvolver localmente e compreender melhor como sua aplicação será executada em um ambiente Linux.
Se você está começando agora, recomendo não tentar memorizar todos os comandos de uma vez.
O melhor caminho é aprender praticando.
Preparei uma sugestão de roteiro de sete dias para desenvolver familiaridade com o terminal.
|
Dia |
Conteúdo |
Exercício prático |
|---|---|---|
|
1 |
Terminal e navegação |
Praticar |
|
2 |
Arquivos e diretórios |
Utilizar |
|
3 |
Pesquisa e leitura |
Trabalhar com |
|
4 |
Permissões |
Experimentar |
|
5 |
Pacotes e processos |
Utilizar |
|
6 |
Serviços e rede |
Conhecer |
|
7 |
Desenvolvimento |
Criar e executar uma API .NET no Linux |
Ao final desse período, você já terá uma boa base para continuar explorando o sistema.
Para facilitar sua consulta durante os estudos, reuni os principais comandos apresentados no artigo.
|
Comando |
Finalidade |
|---|---|
|
|
Mostrar diretório atual |
|
|
Listar arquivos |
|
|
Navegar entre diretórios |
|
|
Criar diretórios |
|
|
Criar arquivos |
|
|
Copiar arquivos |
|
|
Mover ou renomear |
|
|
Remover arquivos |
|
|
Visualizar arquivos |
|
|
Navegar pelo conteúdo |
|
|
Pesquisar textos |
|
|
Localizar arquivos |
|
|
Alterar permissões |
|
|
Alterar proprietário |
|
|
Executar com privilégios administrativos |
|
|
Gerenciar pacotes no Debian/Ubuntu |
|
|
Listar processos |
|
|
Monitorar processos |
|
|
Consultar memória |
|
|
Consultar espaço em disco |
|
|
Consultar tamanho de diretórios |
|
|
Realizar requisições HTTP |
|
|
Acessar servidores remotamente |
|
|
Transferir arquivos |
|
|
Compactar e extrair arquivos |
|
|
Gerenciar serviços systemd |
|
|
Consultar logs do systemd |
|
|
Visualizar o final de arquivos |
|
|
Contar linhas, palavras e caracteres |
Aprender Linux é um investimento importante para qualquer desenvolvedor que deseja ampliar seus conhecimentos sobre infraestrutura, desenvolvimento backend e ambientes de produção.
Você não precisa abandonar o Windows, instalar uma distribuição Linux como sistema principal ou se tornar especialista em administração de servidores.
Começar dominando o terminal, compreender a estrutura de diretórios, aprender a gerenciar arquivos e conhecer os comandos utilizados no dia a dia já representa um excelente avanço.
Para desenvolvedores .NET, esse conhecimento se torna ainda mais interessante quando combinado com Docker, cloud computing, automação e pipelines de CI/CD.
Minha recomendação é simples: escolha uma distribuição, prepare um ambiente de estudos e comece a executar os comandos apresentados neste artigo.
Não tente apenas memorizar. Procure entender o que cada comando faz e em quais situações ele pode ajudar.
Com o tempo, você perceberá que o terminal Linux deixa de ser algo intimidador e passa a ser uma ferramenta natural do seu fluxo de desenvolvimento.
Afinal, um bom desenvolvedor não precisa conhecer apenas a linguagem de programação que utiliza, mas também entender o ambiente onde suas aplicações são executadas.