Tema: shell
-
Códigos de salida de find y xargs: el 0/>0 básico de find frente a la escala 123-127 de xargs
find solo garantiza 0 si todo salió bien y un valor mayor que 0 si hubo errores, sin más detalle a propósito. xargs, en cambio, define una escala concreta de cómo falló el comando invocado: 123 para una salida distinta de cero ordinaria, 124 para la salida 255, 125 si lo mató una señal, 126 si no se puede ejecutar y 127 si no se encuentra. Al canalizar find hacia xargs hay que comprobar dos filosofías distintas de códigos de salida en un mismo pipeline.
-
zsh como shell predeterminado de macOS: qué falla en un script escrito para bash
Desde macOS 10.15, zsh es el shell de inicio de sesión e interactivo predeterminado; un script que da por hecho la división de palabras de bash, los arrays con índice cero o un globbing permisivo puede comportarse de otro modo o fallar en la sesión interactiva zsh de un agente en un Mac, sin contar siquiera la antigüedad de /bin/bash.
-
grep, diff, cmp y test/[: el código de salida 1 significa «no encontrado», no fallo
grep, diff, cmp y el builtin test/[ usan la misma escala de tres valores: 0 para un resultado positivo, 1 para un resultado negativo que no es un error y 2 (o >1) para un problema real. Interpretar el 1 como un fallo del script es la interpretación errónea más habitual que comete un agente con estas herramientas.
-
grep y ripgrep para buscar código: recursión, filtros y códigos de salida
GNU grep busca de forma recursiva con -r, acota con --include y --exclude-dir, y sale con 0, 1 o 2 según haya coincidencia, ausencia de coincidencia o error; ripgrep hace lo mismo por defecto, pero además omite los archivos ignorados por git, ocultos y binarios. Conviene saber qué omite cada herramienta antes de confiar en un resultado vacío.
-
Trampas de configuración regional y fecha en coreutils: LC_ALL, rangos de caracteres, y GNU frente a BSD date
La configuración regional cambia silenciosamente el orden de ordenación, lo que coincide con [a-z], los separadores decimales y el formato de fecha por defecto; los scripts deben fijar LC_ALL=C (o C.UTF-8) y TZ de forma explícita, solicitar formatos de fecha explícitos, y evitar el date -d exclusivo de GNU o el date -v exclusivo de BSD salvo que se conozca la plataforma.
-
sort, uniq y comm: operaciones de conjuntos sobre texto que dependen de una entrada ordenada
uniq solo colapsa los duplicados adyacentes, comm exige que ambas entradas estén ordenadas con la misma colación, y el orden de sort sigue LC_COLLATE; ejecutar estas tuberías bajo LC_ALL=C, elegir las opciones de clave adecuadas (-n, -h, -V, -k, -t) y usar comm -12 y comm -23 para intersecciones y diferencias.
-
«exec format error» y «cannot execute binary file»: incompatibilidades de arquitectura y de shebang
El error ENOEXEC del kernel aparece como «exec format error» o «cannot execute binary file: Exec format error» cuando la arquitectura de CPU no coincide o un script no tiene un shebang utilizable; los saltos de línea CRLF en el shebang provocan un fallo relacionado («bad interpreter» o «required file not found»). El artículo explica cómo distinguirlos con file(1) y cómo corregir cada caso sin adivinar.
-
find y xargs sin sorpresas: nombres separados por null, -exec + y ejecuciones de prueba
Los nombres de archivo pueden contener espacios y saltos de línea, así que hay que pasarlos de find a otros programas con -print0 y xargs -0 (o find -exec ... {} +), probar la selección con -print antes de añadir -delete, y usar xargs -r para que una lista vacía no ejecute nada.
-
Trabajar con JSON en la línea de comandos con jq
jq lee JSON, aplica un filtro e imprime el resultado: usar -r para cadenas simples, -c para un objeto por línea, --arg y --argjson para pasar valores de forma segura, -e para convertir null o false en un código de salida, y select, map y to_entries para remodelar los datos; nunca ensamblar filtros por concatenación de cadenas.
-
Escribir scripts de shell que fallen de forma segura
Conviene usar set -euo pipefail, entrecomillar toda expansión, preferir [[ ]] y los arreglos, revisar las herramientas con ShellCheck, y evitar analizar la salida de ls; un script que se detiene en el primer error inspira más confianza que uno que continúa.
-
Un script de configuración para el primer día que se verifica a sí mismo: bootstrap, doctor y smoke test
Un único comando tras clonar el repositorio produce un entorno funcional o una lista precisa de lo que falta y cómo corregirlo: un script doctor de solo lectura comprueba cada requisito, un bootstrap idempotente instala solo lo que las comprobaciones señalan como ausente y un smoke test determina el código de salida. La CI lo ejecuta desde una máquina limpia para que no se deteriore entre una incorporación y otra.
-
«Argument list too long» (E2BIG) y el límite ARG_MAX
Un comando de shell que se expande a demasiados argumentos falla con «Argument list too long», el error E2BIG de execve(2) causado por el límite ARG_MAX del kernel. El artículo explica cómo medir el límite y cómo sustituir un glob que falla por xargs o por el procesamiento por lotes de find con -exec ... +, en lugar de intentar sortearlo con comillas.
-
sed y awk para ediciones orientadas a líneas: sustitución, campos y cambios in situ
sed aplica comandos de edición, sobre todo s/regexp/reemplazo/, a cada línea; awk divide las líneas en campos y ejecuta pares patrón-acción. Usa sed para sustituciones y borrados, awk para trabajo con columnas y agregaciones pequeñas, y gestiona con cuidado -i, -n y las diferencias entre GNU y BSD.
Legible por máquina: JSON