Fornece padrões de engenharia de software em Bash/Shell Scripting. Cobre execução estrita e segura (set -euo pipefail), manipulação defensiva de variáveis e aspas, funções modulares, verificação de dependências, manipulação de arquivos/redirecionamento, além de integração com ShellCheck e boas práticas de portabilidade.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add dandgabr/skills --skill lang-bash --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Lang Bash?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/dandgabr-lang-bash)More formats (shields.io, HTML) on the badges page.
---
name: "lang-bash"
description: "Fornece padrões de engenharia de software em Bash/Shell Scripting. Cobre execução estrita e segura (set -euo pipefail), manipulação defensiva de variáveis e aspas, funções modulares, verificação de dependências, manipulação de arquivos/redirecionamento, além de integração com ShellCheck e boas práticas de portabilidade."
---
# Habilidade de IA: Engenharia de Bash (Bash & Shell Scripting Specialist)
Esta skill orienta a inteligência artificial a atuar como especialista em **Bash e Shell Scripting**, com foco em scripts seguros, previsíveis, portáveis e com tratamento estrito de erros para automação de sistemas, rotinas de CI/CD e administração de servidores Linux/Unix.
---
## 🧭 Diretrizes de Desenvolvimento em Bash
Ao atuar nesta skill, aplique rigorosamente os seguintes padrões:
### 1. Modo Estrito e Segurança de Execução
- **Configuração Inicial Estrita**: Todo script Bash deve iniciar definindo o modo estrito:
```bash
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
```
- `set -e`: Interrompe a execução imediatamente se qualquer comando retornar status diferente de zero (falha).
- `set -u`: Trata o uso de variáveis não declaradas/não inicializadas como erro.
- `set -o pipefail`: Garante que pipelines (`cmd1 | cmd2`) retornem o código de erro do primeiro comando a falhar no pipeline, e não apenas o último.
- `IFS=$'\n\t'`: Previne *word splitting* indesejado baseado em espaços em branco.
### 2. Manipulação Defensiva de Variáveis e Aspas
- **Aspas em Variáveis**: Sempre envolva o uso de variáveis entre aspas duplas: `"$var"` ou `"${var}"`. Isso evita vazamentos por *word splitting* ou expansão de *globbing*.
- **Uso de Chaves**: Prefira a sintaxe `${var}` para clareza e desambiguação sintática.
- **Valores Padrão**: Use a expansão de parâmetros para tratar variáveis opcionais de forma defensiva:
```bash
LOG_LEVEL="${LOG_LEVEL:-INFO}"
PORT="${1:-8080}"
```
### 3. Funções Modulares e Escopo Local
- **Variáveis Locais**: Declare TODAS as variáveis internas de funções com a palavra-chave `local`.
- **Valores de Retorno**: Funções Bash retornam um código de status numérico (`return 0` para sucesso, `return 1-255` para erros). Para "retornar" dados, imprima no `stdout` e capture com substituição de comando: `result=$(my_function)`.
- **Separar Logs da Saída Útil**: Envie mensagens de log e diagnósticos para o `stderr` (`>&2`) para não poluir a saída principal capturada pelo caller.
### 4. Gestão de Recursos e Limpeza com `trap`
- **Garantia de Cleanup**: Utilize `trap` para capturar sinais de término (`EXIT`, `INT`, `TERM`) e garanta a remoção de arquivos temporários, liberação de locks ou restauração do estado do sistema.
### 5. Portabilidade e Verificação de Dependências
- **Shebang Portável**: Use `#!/usr/bin/env bash` em vez de caminhos fixos como `#!/bin/bash`.
- **Validar Binários Externos**: Antes de invocar utilitários como `jq`, `curl`, ou `docker`, verifique a existência deles no `PATH`:
```bash
command -v jq >/dev/null 2>&1 || { echo "Erro: 'jq' é necessário mas não está instalado." >&2; exit 1; }
```
- **Conformidade com ShellCheck**: Escreva código limpo de acordo com as regras de análise estática do ShellCheck.
---
## 🧰 Padrões de Código Recomendados
### Template de Script Profissional e Robusto com Cleanup e Option Parsing
```bash
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# Configurações e Globais
readonly SCRIPT_NAME="$(basename "$0")"
readonly TMP_DIR="$(mktemp -d -t "${SCRIPT_NAME}.XXXXXX")"
# Função de Limpeza (Executada automaticamente no EXIT)
cleanup() {
local exit_code=$?
if [[ -d "$TMP_DIR" ]]; then
rm -rf "$TMP_DIR"
fi
exit "$exit_code"
}
trap cleanup EXIT INT TERM
# Funções de Logging (Direcionadas para stderr)
log_info() {
printf '[INFO] %s\n' "$*" >&2
}
log_error() {
printf '[ERROR] %s\n' "$*" >&2
}
usage() {
cat <<EOF
Uso: ${SCRIPT_NAME} [OPÇÕES] -i <input_file>
Opções:
-i, --input FILE Caminho do arquivo de entrada (obrigatório)
-o, --output FILE Caminho do arquivo de saída (opcional)
-h, --help Exibe esta ajuda
EOF
}
# Parsing de Argumentos
parse_args() {
local input_file=""
local output_file=""
while [[ $# -gt 0 ]]; do
case "$1" in
-i|--input)
input_file="${2:-}"
shift 2
;;
-o|--output)
output_file="${2:-}"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
log_error "Opção desconhecida: $1"
usage
exit 1
;;
esac
done
if [[ -z "$input_file" ]]; then
log_error "O parâmetro --input é obrigatório."
usage
exit 1
fi
echo "$input_file" "$output_file"
}
# Função Principal
main() {
local input_file=""
local output_file=""
read -r input_file output_file <<< "$(parse_args "$@")"
if [[ ! -f "$input_file" ]]; then
log_error "Arquivo de entrada não encontrado: $input_file"
exit 1
fi
log_info "Processando o arquivo: $input_file"
local temp_output="${TMP_DIR}/processed.txt"
# Exemplo de processamento seguro linha a linha
while IFS= read -r line || [[ -n "$line" ]]; do
# Processa apenas linhas não vazias e que não são comentários
if [[ -n "$line" && ! "$line" =~ ^[[:space:]]*# ]]; then
printf 'PROCESSED: %s\n' "$line" >> "$temp_output"
fi
done < "$input_file"
if [[ -n "$output_file" ]]; then
mv "$temp_output" "$output_file"
log_info "Resultado salvo em: $output_file"
else
cat "$temp_output"
fi
}
main "$@"
```
### Verificação de Dependências e Leitura Segura de Arquivos JSON
```bash
#!/usr/bin/env bash
set -euo pipefail
# Garante dependências antes da execução
check_dependencies() {
local dep
for dep in jq curl; do
if ! command -v "$dep" >/dev/null 2>&1; then
printf '[ERROR] Dependência ausente: %s\n' "$dep" >&2
return 1
fi
done
}
fetch_github_user() {
local username="${1:-}"
if [[ -z "$username" ]]; then
printf '[ERROR] Usuário não informado.\n' >&2
return 1
fi
local response
response=$(curl -sSL "https://api.github.com/users/${username}")
local name
name=$(echo "$response" | jq -r '.name // "N/A"')
printf 'User: %s | Name: %s\n' "$username" "$name"
}
main() {
check_dependencies || exit 1
fetch_github_user "octocat"
}
main "$@"
```
## 🔒 Questões de Segurança e Práticas Seguras
- **Injeção de Comando**: Evite expandir variáveis diretamente em comandos do sistema. Use aspas duplas sempre que possível (`"$var"` em vez de `$var`) para evitar divisão de palavras e globbing.
- **Definições Seguras de Inicialização**: Use sempre `set -euo pipefail` no início dos scripts para que o interpretador pare imediatamente em caso de erro, variáveis indefinidas ou falhas ocultas em pipelines.
- **Manipulação de Variável $PATH**: Evite executar binários relativos ou depender de um `$PATH` herdado não controlado. Defina um `$PATH` explícito no início de scripts SUID ou administrativos.
- **Arquivos Temporários**: Nunca crie arquivos temporários fixos (ex: `/tmp/temp.txt`). Use o comando `mktemp` para gerar nomes de arquivos temporários aleatórios e seguros.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!