Script Bash seguro e robusto: erros, bloqueio, logs e modo dry-run

Gera um script Bash pronto para servidores: modo estrito, limpeza com trap, argumentos com getopts, bloqueio contra execuções simultâneas, logs, dry-run e código limpo para o ShellCheck. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 4 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.

Intermédio · Código · Pendente de revisão editorial

Prompt

Atua como administrador de sistemas Linux que escreve scripts de shell seguros e fáceis de manter.

Preciso de um script que faça o seguinte: {{tarefa}}
- Ambiente onde vai correr: {{ambiente}}
- Entradas (argumentos, ficheiros, variáveis): {{entradas}}
- O que altera ou apaga: {{efeitos}}

Entregáveis:
1. O script completo com:
   - Shebang adequado ao ambiente e modo estrito (`set -Eeuo pipefail`) ou equivalente se a shell não for Bash, explicando as suas armadilhas.
   - Uma função `usage` e análise de argumentos com `getopts`, incluindo `-h`, `-v` (detalhado) e `-n` (dry-run).
   - Verificação de dependências com `command -v` e mensagens claras se faltar alguma.
   - Variáveis sempre entre aspas, `local` nas funções e nada de `eval`.
   - Ficheiros temporários com `mktemp` e limpeza com `trap` em `EXIT`, `INT` e `TERM`.
   - Bloqueio com `flock` (ou alternativa portável) para impedir duas execuções em simultâneo.
   - Logs com marca temporal para stderr e, opcionalmente, para um ficheiro.
   - Códigos de saída documentados.
   - Em modo dry-run, mostrar o que faria sem executar nada destrutivo.
2. Explicação de cada bloco e de qualquer linha perigosa (eliminações, permissões, `sudo`).
3. Como verificar: ShellCheck sem avisos e alguns testes com bats-core ou um procedimento manual numa pasta de testes.
4. Como agendá-lo com cron ou um timer do systemd, se fizer sentido, com o PATH e as variáveis necessárias.

Restrições:
- Qualquer `rm` ou sobrescrita tem de validar antes que o caminho não está vazio nem é `/`.
- Não inventes caminhos nem nomes de servidores: usa os meus ou [PREENCHER].
- Se a tarefa for ambígua ou perigosa, pergunta-me antes de escrever o script.
- Recomenda testá-lo primeiro com `-n` e fora de produção.

Como utilizar

  1. Descreve a tarefa passo a passo, como a farias à mão.
  2. Indica o sistema exato (distribuição, macOS ou contentor), porque muda a shell disponível.
  3. Passa o ShellCheck, executa com -n e revê a saída antes de tirar o dry-run.

Exemplo de utilização

Tarefa: comprimir os logs com mais de 7 dias em /var/log/minhaapp e apagar os com mais de 30 · Ambiente: Ubuntu 24.04 com Bash 5 · Efeitos: apaga ficheiros antigos.

Exemplo de resultado

1. Script

#!/usr/bin/env bash
# rodar-logs.sh — comprime .log com mais de N dias e apaga .gz com mais de M dias
set -Eeuo pipefail

LOG_DIR="/var/log/minhaapp"; DIAS_COMPRIMIR=7; DIAS_APAGAR=30
DRY_RUN=0; VERBOSE=0; LOCK="/run/lock/rodar-logs.lock"

log()   { printf '%s [%s] %s\n' "$(date '+%F %T')" "$1" "$2" >&2; }
usage() { echo "Uso: ${0##*/} [-h] [-v] [-n] [-d pasta] [-c dias] [-r dias]"; }
run()   { if (( DRY_RUN )); then log DRY "$*"; return 0; fi
          if (( VERBOSE )); then log INFO "$*"; fi; "$@"; }

while getopts ":hvnd:c:r:" opt; do
  case "$opt" in
    h) usage; exit 0 ;;  v) VERBOSE=1 ;;  n) DRY_RUN=1 ;;
    d) LOG_DIR="$OPTARG" ;;  c) DIAS_COMPRIMIR="$OPTARG" ;;  r) DIAS_APAGAR="$OPTARG" ;;
    *) usage; exit 1 ;;
  esac
done

# Nunca operar sobre um caminho vazio nem sobre /
[[ -n "$LOG_DIR" && "$LOG_DIR" != "/" && -d "$LOG_DIR" ]] || { log ERROR "pasta inválida: $LOG_DIR"; exit 2; }
[[ "$DIAS_COMPRIMIR$DIAS_APAGAR" =~ ^[0-9]+$ ]] || { log ERROR "os dias têm de ser inteiros"; exit 1; }
command -v gzip >/dev/null || { log ERROR "falta o gzip"; exit 3; }

exec 9>"$LOCK"; flock -n 9 || { log WARN "já existe outra execução em curso"; exit 4; }

find "$LOG_DIR" -type f -name '*.log' -mtime +"$DIAS_COMPRIMIR" -print0 |
  while IFS= read -r -d '' f; do run gzip -- "$f"; done
find "$LOG_DIR" -type f -name '*.gz' -mtime +"$DIAS_APAGAR" -print0 |
  while IFS= read -r -d '' f; do run rm -f -- "$f"; done

-print0 com read -d '' suporta nomes com espaços, e -- impede que um ficheiro começado por hífen seja lido como opção. Corre primeiro ./rodar-logs.sh -n -v e passa-o pelo ShellCheck…

Dados-chave

Categoria
Programação e desenvolvimento · Automatizações
Tipo de resultado
Código
Nível
Intermédio
Pensado para
ChatGPT, Claude, Gemini e Microsoft Copilot
Verificado em
Pendente de verificação editorial
Variáveis
Tarefa, Ambiente, Entradas e O que altera ou apaga
Idioma
Português
Preço
Gratuito, sem registo
Atualizado
07/11/2026

Perguntas frequentes

O que faz exatamente o set -Eeuo pipefail?

Faz o script parar perante um erro (-e), variáveis não definidas (-u) e falhas de qualquer comando num pipe (pipefail); o -E propaga o trap de ERR às funções. Tem exceções, por isso o prompt pede que sejam explicadas.

Para que serve o flock num script agendado?

Evita que duas execuções se sobreponham quando a anterior ainda não terminou, algo comum com cron. Sem bloqueio, duas cópias podem estragar os ficheiros uma da outra ou duplicar o trabalho.

Para que serve este prompt?

Gera um script Bash pronto para servidores: modo estrito, limpeza com trap, argumentos com getopts, bloqueio contra execuções simultâneas, logs, dry-run e código limpo para o ShellCheck.

Com que ferramentas de IA funciona?

Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.

Como personalizo o prompt?

Clique em “Personalizar” e preencha as variáveis (Tarefa, Ambiente, Entradas e O que altera ou apaga). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.

Preciso de experiência para o utilizar?

É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.

Este prompt é gratuito?

Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.

Posso confiar no resultado da IA?

Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.

Prompts relacionados