De Bash para V: Um Guia Prático para Sysadmins, SREs e DevOps

Table of contents
- Por que migrar do Bash para V?
- Velocidade de Execução: Bash vs Vlang
- Portabilidade: Executáveis sem dependências
- CI/CD, Git e Reuso com Binários
- Shellcheck e IDEs com Vlang
- Executando comandos do sistema
- Trabalhando com arquivos
- Variáveis de ambiente
- Criando ferramentas de linha de comando
- Exemplo: Deploy simples
- Substituindo Shell Scripts com vsh: A forma nativa e portável do V
- Dicas e Boas Práticas
- Conclusão

Sysadmins, SREs e profissionais de DevOps tradicionalmente confiam em scripts bash para automações do dia a dia, gerenciamento de sistemas, deploys e manutenção de infraestrutura. No entanto, à medida que as demandas por segurança, legibilidade e manutenibilidade aumentam, linguagens modernas como V (Vlang) surgem como alternativas robustas, seguras e extremamente performáticas.
Neste artigo, vamos explorar como migrar scripts comuns em Bash (Shell Script) para Vlang, com foco em:
Execução de comandos no sistema
Manipulação de arquivos
Trabalhando com variáveis de ambiente
Criando ferramentas de linha de comando
Tratamento de erros robusto
Aqui o guia sobre o Vlang:
Por que migrar do Bash para V?
Compilação rápida e executáveis nativos sem dependências
Erros detectados em tempo de compilação
Sintaxe simples e moderna
Segurança de memória e ausência de nulls
Multiplataforma
Suporte a CLI e automação
Referência: Documentação oficial do V
Velocidade de Execução: Bash vs Vlang
Scripts em Bash são interpretados linha por linha, o que pode ser suficiente para tarefas simples, mas torna-se um gargalo em pipelines complexos, loops pesados, ou operações de IO e rede em larga escala.
Já o Vlang compila para binário nativo, sem dependências de runtime. Isso significa:
Execução instantânea
Uso otimizado de CPU e memória
Ideal para ferramentas CLI intensivas e automações frequentes
Benchmark prático:
Um script de leitura de logs e filtragem que levava ~1.2s em Bash caiu para ~0.05s em V compilado. O ganho é real e direto.
Portabilidade: Executáveis sem dependências
Uma das maiores vantagens do Vlang é a portabilidade extrema dos binários gerados:
Binários são statically linked
Zero dependência externa (como Python, Node, ou mesmo Bash)
Podem ser executados diretamente em:
Containers Docker (imagem
scratch
oualpine
)Máquinas virtuais
Ambientes bare-metal
Distros minimalistas (e.g., Alpine, BusyBox)
Exemplo de uso em Docker
FROM scratch
COPY meuapp /meuapp
ENTRYPOINT ["/meuapp"]
Sem glibc
, sem bash
, sem nada. Só o binário “meuapp”.
CI/CD, Git e Reuso com Binários
Com o código-fonte em V versionado no Git, a integração em pipelines de CI/CD é simples e robusta:
Compilação rápida (em milissegundos)
Uso em GitHub Actions, GitLab CI, Jenkins, etc.
Distribuição do binário via:
Armazenamento em artefatos do pipeline
Sistemas de pacote internos (ex: Nexus, Artifactory)
Releases no GitHub
Copia direta para repositórios ou buckets (S3, GCS)
Exemplo de pipeline GitHub Actions
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install V
run: git clone https://github.com/vlang/v && cd v && make
- name: Build
run: ./v/v main.v -o meuapp
- name: Upload binary
uses: actions/upload-artifact@v3
with:
name: meuapp
path: ./meuapp
Shellcheck e IDEs com Vlang
No ecossistema do V (Vlang), ainda não existe uma ferramenta tão consolidada quanto o ShellCheck é para Bash.
No entanto, o V tem algumas características que compensam isso parcialmente:
Compilador com verificação estática embutida
O próprio compilador do V (v
) já faz verificações estáticas rigorosas durante a compilação, incluindo:
Verificação de tipo estrita.
Detecção de variáveis não usadas.
Detecção de uso de variáveis não inicializadas.
Detecção de erros de sintaxe e lógica simples.
Formatter com verificação básica
Além de formatar o código, o v fmt
também pode ajudar a detectar certas anomalias no código. Embora não seja um linter completo, ele força um padrão e ajuda a identificar inconsistências.
v-analyzer
O v-analyzer
é o language server oficial do Vlang, projetado para oferecer:
Autocompletar
Go to definition
Documentação inline
Detecção de erros estáticos
Renomear símbolos
E futuramente, recursos como linter mais completo e refatoração automática
Ele é essencialmente o "motor de inteligência" por trás das extensões de V para as IDEs.
IDEs
As IDEs mais comuns possuem plugins/extensões: Zed, IntelliJ, VSCode e seus forks como o Cursor, Windsurf/Codeium, Eclipse Theia… Pois estão no Open VSX Registry, MAS não vi disponíveis nas versões web como o github.dev.
https://open-vsx.org/?search=vlang
Com o v-analyzer via LSP, é possível configurar o Vim/Neovim/Emacs.
Mas não encontrei no Pulsar (o novo Atom), Phoenix Code (o novo Brackets), Lapce, Netbeans (hahaha)
Executando comandos do sistema
Bash
#!/bin/bash
echo "Atualizando pacotes..."
sudo apt update
Vlang
import os
fn main() {
println('Atualizando pacotes...')
output := os.execute('sudo apt update') or {
eprintln('Erro ao executar comando: $err')
return
}
println(output.output)
}
Utilizamos
os.execute()
para rodar comandos shell.O operador
or
garante tratamento de erro robusto.
Mais sobre isso em:
Utilizando os.system e operador or
Trabalhando com arquivos
Bash
#!/bin/bash
echo "Backup do arquivo"
cp /etc/nginx/nginx.conf ~/backup/
Vlang
import os
fn main() {
source := '/etc/nginx/nginx.conf'
destination := os.join_path(os.home_dir(), 'backup', 'nginx.conf')
os.cp(source, destination) or {
eprintln('Erro ao copiar arquivo: $err')
return
}
println('Backup realizado com sucesso.')
}
Variáveis de ambiente
Bash
#!/bin/bash
echo "User: $USER"
Vlang
import os
fn main() {
user := os.getenv('USER')
println('User: $user')
}
Criando ferramentas de linha de comando
Vlang possui suporte nativo a CLI.
Inclusive o cli: https://modules.vlang.io/cli.html e o flag: https://modules.vlang.io/flag.html permitem criar uma CLI completa, com subcomandos declarativos, aplicando parse e outras opções.
Veja como criar algo mais simples ainda:
Bash
#!/bin/bash
if [ "$1" == "start" ]; then
echo "Iniciando serviço..."
fi
Vlang
import os
import flag
fn main() {
mut fp := flag.new_flag_parser(os.args)
fp.application('servico')
fp.description('Ferramenta CLI de exemplo em Vlang')
cmd := fp.finalize() or {
eprintln('Erro ao processar argumentos: $err')
return
}
if cmd.len > 0 && cmd[0] == 'start' {
println('Iniciando serviço...')
} else {
println('Uso: servico start')
}
}
Exemplo: Deploy simples
Bash
#!/bin/bash
echo "Parando app..."
systemctl stop meuapp
echo "Atualizando binário..."
cp ./build/meuapp /usr/local/bin/
echo "Iniciando app..."
systemctl start meuapp
Vlang
import os
fn main() {
println('Parando app...')
os.execute('systemctl stop meuapp') or {
eprintln('Falha ao parar o app: $err')
return
}
println('Atualizando binário...')
os.cp('./build/meuapp', '/usr/local/bin/meuapp') or {
eprintln('Falha ao copiar binário: $err')
return
}
println('Iniciando app...')
os.execute('systemctl start meuapp') or {
eprintln('Falha ao iniciar o app: $err')
return
}
println('Deploy concluído com sucesso!')
}
Substituindo Shell Scripts com vsh: A forma nativa e portável do V
O que é vsh
?
V oferece suporte a shell scripts multiplataforma com uma sintaxe similar ao Bash, mas com a segurança, portabilidade e legibilidade de uma linguagem compilada. Essa funcionalidade é chamada de vsh
(V shell scripting) e permite escrever scripts em V como se fossem em shell, mas com todos os benefícios da linguagem V.
vsh scripts with no extension (caso queira remover a extensão .vsh)
Para usar o modo de script do V, salve seu arquivo de origem com a extensão de arquivo .vsh. Ele tornará globais todas as funções do módulo os (para que você possa usar mkdir() em vez de os.mkdir(), por exemplo).
Modulo os: https://modules.vlang.io/os.html
O V também sabe compilar e executar arquivos .vsh imediatamente, portanto, você não precisa de uma etapa separada para compilá-los.
O V também recompilará um executável, produzido por um arquivo .vsh, somente quando ele for mais antigo que o arquivo de origem .vsh, ou seja, executado após o primeiro, será mais rápido, pois não há necessidade de recompilar um script que não foi alterado.
Um exemplo, deploy.vsh
Agora você pode compilar isso como um programa V normal e obter um binário que pode ser implantado e executado em qualquer lugar:v -skip-running deploy.vsh && ./deploy
Ou executá-lo como um script Bash tradicional:v run deploy.vsh
ou simplesmente:
v deploy.vsh
Aqui um exemplo de .vsh sendo usado com docker:
Dicas e Boas Práticas
Sempre trate erros com
or
para evitar falhas silenciosas.Use
os.input()
para interações básicas com o usuário.Modularize scripts maiores em funções e arquivos separados.
Use
v fmt -w
para manter o código formatado.Estude os pacotes padrão de V para arquivos, rede, CLI, HTTP, etc.
Sobre como tratar erros, veja o artigo:
https://esli.blog.br/tecnicas-para-lidar-com-erros-em-vlang-utilizando-ossystem-e-operador-or
Onde explorei o or
no meu script de configuração de novas instalações de distro em desktop.
Conclusão
Migrar de Bash para Vlang oferece vantagens significativas em termos de segurança, performance, manutenção e portabilidade. Combinando a simplicidade do Bash com a força de uma linguagem compilada, o V pode ser uma excelente escolha nos seus projetos.
A curva de aprendizado é suave, especialmente para quem já lida com automação e scripts shell.
Projeto pessoal de shell script para vlang
Tenho um script que chamo de UAI-FAI, basicamente, ele configura uma nova instalação do Fedora ou Ubuntu com os apps e configurações que preciso. Rodo isso 1x ao ano rsrsss
Inicialmente, fiz ele em Bash/Shell Script: https://github.com/Esl1h/UAI-FAI/blob/main/install.sh
E por aprendizado, movi (ainda melhorando) todo ele para Vlang: https://github.com/Esl1h/UAI-FAI/blob/main/V/src/main.v
Não é algo num ambiente corporativo e produtivo, algo que possa ser considerado SRE, mas é um exemplo :-) Caso desenvolva algo que possa ser publicado, criarei um novo post aqui.
Aqui, exploro a criação de web server usando o vlang:
Discord Server: https://discord.gg/vlang
https://github.com/orgs/vlang/repositories
https://github.com/vlang/v/wiki/V-for-Bash-script-developers
https://levelup.gitconnected.com/vlang-for-automation-scripting-5d977ee97de
Subscribe to my newsletter
Read articles from Esli Silva directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Esli Silva
Esli Silva
Linux hard user since 2003, IT manager, DevOps, Sysadmin, SRE, teacher, Bass player, Krav Maga fighter and Marksman (Sport Shooter).