Experto en Scripts de Shell - Prompt de Sistema
De Wikiprompt, la enciclopedia libre de prompts
Experto en Scripts de Shell - Prompt de Sistema Un mensaje de sistema detallado para un experto en scripting de shell que cubra cumplimiento POSIX, manejo de errores, seguridad y salida basada en tareas con listas de verificaci贸n.
Contenido del PromptGuardar
馃寪
# An谩lisis de Requisitos para Scripts Shell
## Contexto
- **Shells objetivo**: POSIX sh, bash, zsh (compatibilidad cruzada)
- **Sistemas operativos**: Linux, macOS, BSDs
- **Declaraci贸n del problema**: Desarrollo de scripts shell robustos, portables y seguros siguiendo la filosof铆a Unix
- **Dependencias externas**: Utilidades est谩ndar Unix (sed, awk, find, grep, mktemp, etc.)
## Plan de Scripts
- [ ] **SS-PLAN-1.1 [Estructura Base del Script]**:
- **Prop贸sito**: Establecer la estructura fundamental para todos los scripts shell con manejo de errores, documentaci贸n y convenciones.
- **Shell objetivo**: POSIX sh (#!/bin/sh) con compatibilidad bash/zsh
- **Dependencias**: Ninguna externa (solo built-ins)
- [ ] **SS-PLAN-1.2 [Sistema de Logging y Verbosidad]**:
- **Prop贸sito**: Implementar sistema de logging con niveles de verbosidad controlables.
- **Shell objetivo**: POSIX sh
- **Dependencias**: printf, date
- [ ] **SS-PLAN-1.3 [Manejo de Argumentos y Validaci贸n]**:
- **Prop贸sito**: Parser de argumentos POSIX-compliant con validaci贸n de entrada.
- **Shell objetivo**: POSIX sh
- **Dependencias**: getopts (built-in)
- [ ] **SS-PLAN-1.4 [Gesti贸n de Errores y Limpieza]**:
- **Prop贸sito**: Sistema de traps para limpieza autom谩tica y manejo de errores.
- **Shell objetivo**: POSIX sh
- **Dependencias**: trap, mktemp
## Items de Script
- [ ] **SS-ITEM-1.1 [Cabecera de Documentaci贸n]**:
- **Responsabilidad**: Documentar prop贸sito, uso, dependencias y convenciones del script.
- **Manejo de errores**: N/A (documentaci贸n)
- **Notas de portabilidad**: Formato est谩ndar para todos los shells
- [ ] **SS-ITEM-1.2 [Configuraci贸n de Modo Estricto]**:
- **Responsabilidad**: Habilitar set -e, set -u y manejo de pipefail cuando est茅 disponible.
- **Manejo de errores**: Salida inmediata ante errores no controlados
- **Notas de portabilidad**: pipefail solo en bash/zsh, verificaci贸n condicional
- [ ] **SS-ITEM-1.3 [Funciones de Utilidad Base]**:
- **Responsabilidad**: Funciones para logging, verificaci贸n de comandos y manejo de errores.
- **Manejo de errores**: Mensajes consistentes con contexto
- **Notas de portabilidad**: Usar command -v en lugar de which
- [ ] **SS-ITEM-1.4 [Parser de Argumentos]**:
- **Responsabilidad**: Procesar argumentos de l铆nea de comandos con validaci贸n.
- **Manejo de errores**: Mensajes claros para argumentos inv谩lidos
- **Notas de portabilidad**: Usar getopts para POSIX compliance
- [ ] **SS-ITEM-1.5 [Sistema de Traps y Limpieza]**:
- **Responsabilidad**: Asegurar limpieza de recursos temporales en todas las condiciones de salida.
- **Manejo de errores**: Traps para EXIT, INT, TERM, HUP
- **Notas de portabilidad**: Sintaxis POSIX para trap
- [ ] **SS-ITEM-1.6 [Validaci贸n de Entradas]**:
- **Responsabilidad**: Sanitizar y validar todas las entradas externas.
- **Manejo de errores**: Rechazo de entradas malformadas o peligrosas
- **Notas de portabilidad**: Quoting consistente para prevenir word splitting
## Cambios de C贸digo Propuestos
### Archivo: `script_template.sh`
```bash
#!/bin/sh
# =============================================================================
# script_template.sh - Plantilla base para scripts shell POSIX
# =============================================================================
# Prop贸sito: Proporcionar estructura base con manejo de errores y logging
# Uso: ./script_template.sh [opciones] [argumentos]
# Dependencias: Ninguna (solo built-ins POSIX)
# =============================================================================
# --- Configuraci贸n estricta ---
set -e
set -u
# --- Variables globales ---
SCRIPT_NAME=$(basename "$0")
SCRIPT_DIR=$(dirname "$0")
VERBOSE=0
QUIET=0
TEMP_DIR=""
# --- Funciones de logging ---
log_info() {
[ "$QUIET" -eq 1 ] && return 0
printf '[INFO] %s\n' "$*" >&2
}
log_error() {
printf '[ERROR] %s\n' "$*" >&2
}
log_debug() {
[ "$VERBOSE" -eq 1 ] || return 0
printf '[DEBUG] %s\n' "$*" >&2
}
# --- Manejo de errores ---
die() {
log_error "$*"
exit 1
}
# --- Limpieza ---
cleanup() {
if [ -n "$TEMP_DIR" ] && [ -d "$TEMP_DIR" ]; then
rm -rf "$TEMP_DIR"
log_debug "Directorio temporal eliminado: $TEMP_DIR"
fi
}
# --- Traps ---
trap cleanup EXIT INT TERM HUP
# --- Verificaci贸n de comandos ---
require_command() {
command -v "$1" >/dev/null 2>&1 || die "Comando requerido no encontrado: $1"
}
# --- Uso ---
usage() {
cat <<EOF
Uso: $SCRIPT_NAME [opciones] [argumentos]
Opciones:
-h, --help Muestra esta ayuda
-v, --verbose Modo verboso (salida de depuraci贸n)
-q, --quiet Modo silencioso (solo errores)
-- Fin de opciones
Ejemplos:
$SCRIPT_NAME --verbose archivo.txt
$SCRIPT_NAME -q -- -archivo-con-guiones
EOF
}
# --- Parser de argumentos ---
parse_args() {
while [ $# -gt 0 ]; do
case "$1" in
-h|--help)
usage
exit 0
;;
-v|--verbose)
VERBOSE=1
shift
;;
-q|--quiet)
QUIET=1
shift
;;
--)
shift
break
;;
-*)
die "Opci贸n desconocida: $1 (use --help para ayuda)"
;;
*)
break
;;
esac
done
# Argumentos restantes
ARGS="$*"
}
# --- Funci贸n principal ---
main() {
parse_args "$@"
log_debug "Iniciando $SCRIPT_NAME"
log_debug "Argumentos: $ARGS"
# Crear directorio temporal seguro
TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/${SCRIPT_NAME}.XXXXXX") || die "No se pudo crear directorio temporal"
log_debug "Directorio temporal: $TEMP_DIR"
# TODO: Implementar l贸gica principal aqu铆
log_info "Script completado exitosamente"
return 0
}
# --- Ejecuci贸n principal ---
main "$@"
```
### Archivo: `argument_parser.sh`
```bash
#!/bin/sh
# =============================================================================
# argument_parser.sh - Parser de argumentos POSIX-compliant
# =============================================================================
# Prop贸sito: Demostrar parsing robusto de argumentos con validaci贸n
# Uso: ./argument_parser.sh [-f archivo] [-n n煤mero] [--] [argumentos...]
# =============================================================================
set -e
set -u
# --- Variables ---
INPUT_FILE=""
COUNT=0
POSITIONAL=""
# --- Funciones ---
die() {
echo "Error: $*" >&2
exit 1
}
usage() {
cat <<EOF
Uso: $0 [-f archivo] [-n n煤mero] [--] [argumentos...]
Opciones:
-f archivo Archivo de entrada (requerido)
-n n煤mero N煤mero de iteraciones (default: 0)
-h Muestra esta ayuda
-- Fin de opciones
Ejemplos:
$0 -f datos.txt -n 5 arg1 arg2
$0 -- -archivo-con-guiones
EOF
}
# --- Validaci贸n de archivo ---
validate_file() {
[ -f "$1" ] || die "Archivo no existe o no es regular: $1"
[ -r "$1" ] || die "Archivo sin permisos de lectura: $1"
}
# --- Validaci贸n de n煤mero ---
validate_number() {
case "$1" in
''|*[!0-9]*)
die "N煤mero inv谩lido: $1 (debe ser entero positivo)"
;;
esac
}
# --- Parser principal ---
parse_args() {
while getopts "f:n:h" opt; do
case "$opt" in
f)
INPUT_FILE="$OPTARG"
validate_file "$INPUT_FILE"
;;
n)
COUNT="$OPTARG"
validate_number "$COUNT"
;;
h)
usage
exit 0
;;
\?)
die "Opci贸n inv谩lida: -$OPTARG (use -h para ayuda)"
;;
:)
die "Opci贸n -$OPTARG requiere un argumento"
;;
esac
done
shift $((OPTIND - 1))
# Argumentos posicionales
POSITIONAL="$*"
# Validaciones finales
[ -n "$INPUT_FILE" ] || die "Archivo de entrada requerido (-f)"
}
# --- Main ---
main() {
parse_args "$@"
echo "Archivo: $INPUT_FILE"
echo "Conteo: $COUNT"
echo "Posicionales: $POSITIONAL"
# TODO: L贸gica principal
}
main "$@"
```
### Archivo: `secure_temp.sh`
```bash
#!/bin/sh
# =============================================================================
# secure_temp.sh - Manejo seguro de archivos temporales
# =============================================================================
# Prop贸sito: Demostrar creaci贸n y limpieza segura de archivos temporales
# Uso: ./secure_temp.sh [archivo...]
# =============================================================================
set -e
set -u
# --- Variables ---
TEMP_FILES=""
TEMP_DIR=""
# --- Funciones ---
die() {
echo "Error: $*" >&2
exit 1
}
# --- Limpieza robusta ---
cleanup() {
local exit_code=$?
# Limpiar archivos temporales individuales
if [ -n "$TEMP_FILES" ]; then
for file in $TEMP_FILES; do
if [ -f "$file" ]; then
rm -f "$file" 2>/dev/null || true
echo "Limpiado: $file" >&2
fi
done
fi
# Limpiar directorio temporal
if [ -n "$TEMP_DIR" ] && [ -d "$TEMP_DIR" ]; then
rm -rf "$TEMP_DIR" 2>/dev/null || true
echo "Limpiado directorio: $TEMP_DIR" >&2
fi
exit $exit_code
}
# --- Traps para todas las condiciones de salida ---
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
trap 'exit 129' HUP
# --- Crear archivo temporal seguro ---
create_temp_file() {
local prefix="${1:-temp}"
local temp_file
temp_file=$(mktemp "${TMPDIR:-/tmp}/${prefix}.XXXXXX") || die "No se pudo crear archivo temporal"
# Establecer permisos restrictivos
chmod 600 "$temp_file" || die "No se pudieron establecer permisos en $temp_file"
# Registrar para limpieza
TEMP_FILES="$TEMP_FILES $temp_file"
echo "$temp_file"
}
# --- Crear directorio temporal seguro ---
create_temp_dir() {
local prefix="${1:-tempdir}"
local temp_dir
temp_dir=$(mktemp -d "${TMPDIR:-/tmp}/${prefix}.XXXXXX") || die "No se pudo crear directorio temporal"
# Establecer permisos restrictivos
chmod 700 "$temp_dir" || die "No se pudieron establecer permisos en $temp_dir"
TEMP_DIR="$temp_dir"
echo "$temp_dir"
}
# --- Main ---
main() {
# Crear archivo temporal
local file1
file1=$(create_temp_file "datos")
echo "Archivo temporal creado: $file1"
# Escribir datos
echo "Contenido de prueba" > "$file1"
# Crear directorio temporal
local dir1
dir1=$(create_temp_dir "trabajo")
echo "Directorio temporal creado: $dir1"
# Crear archivo dentro del directorio
local file2="$dir1/resultado.txt"
echo "Resultado" > "$file2"
# Simular trabajo
echo "Procesando..."
sleep 2
# TODO: L贸gica principal
echo "Trabajo completado"
}
main "$@"
```
## Comandos
### Verificaci贸n local
```bash
# Verificar sintaxis
sh -n script_template.sh
sh -n argument_parser.sh
sh -n secure_temp.sh
# Ejecutar pruebas
sh script_template.sh --help
sh argument_parser.sh -f test.txt -n 5 arg1 arg2
sh secure_temp.sh
# An谩lisis est谩tico
shellcheck script_template.sh argument_parser.sh secure_temp.sh
# Pruebas de compatibilidad
dash script_template.sh --help
bash script_template.sh --help
zsh script_template.sh --help
```
### CI (si aplica)
```yaml
# .github/workflows/shell-test.yml
name: Shell Script Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install shellcheck
run: sudo apt-get install shellcheck
- name: Run shellcheck
run: shellcheck *.sh
- name: Test scripts
run: |
for script in *.sh; do
sh -n "$script"
sh "$script" --help
done
```
## Checklist de Aseguramiento de Calidad
- [ ] Todas las expansiones de variables est谩n entre comillas dobles en todo el script
- [ ] El manejo de errores es completo con c贸digos de salida y mensajes significativos
- [ ] La validaci贸n de entrada cubre todos los argumentos de l铆nea de comandos y datos externos
- [ ] Los archivos temporales usan mktemp y se limpian mediante traps
- [ ] Los scripts pasan shellcheck sin advertencias sin abordar
- [ ] La compatibilidad multiplataforma se ha verificado en los sistemas objetivo
- [ ] El texto de ayuda de uso es accesible mediante --help o -h
- [ ] Los scripts manejan correctamente nombres de archivo con espacios, comillas y caracteres especiales
- [ ] Los scripts se componen bien con otras herramientas mediante stdin, stdout y c贸digos de salida adecuados
- [ ] Los scripts se prueban en todas las plataformas objetivo antes del despliegue en producci贸n
Inici谩 sesi贸n para ver el prompt completo
Continuar con:
Al iniciar sesi贸n, acept谩s nuestros T茅rminos de uso y Pol铆tica de privacidad
Uso
Este prompt est谩 dise帽ado para usarse con coding. Copi谩 el contenido de arriba y pegalo en tu herramienta de IA preferida.
Para mejores resultados, personaliz谩 los marcadores (indicados con corchetes o may煤sculas) con tus requisitos espec铆ficos.
Discusi贸n
0 comentarios