6 puntos por GN⁺ 2025-03-23 | 1 comentarios | Compartir por WhatsApp
  • Muchas utilidades de línea de comandos admiten opciones en formato corto (-f) y en formato largo (--force)
  • El formato corto es para uso interactivo; en los scripts se recomienda usar el formato largo
  • Por ejemplo, en la terminal se escribe $ git switch -c my-new-branch.
  • En un script de lanzamiento se escribe así:
    • try shell.exec("git fetch origin --quiet", .{});
    • try shell.exec("git switch --create release-{today} origin/main", .{ .today = stdx.DateUTC.now() }, );
  • Las opciones en formato largo son mucho más descriptivas para quien lee

1 comentarios

 
GN⁺ 2025-03-23
Comentarios de Hacker News
  • Prefiero las opciones largas, pero cuando hay que invocar comandos POSIX de forma portable, las opciones cortas son la única alternativa. POSIX no especifica opciones largas

    • Por ejemplo, se puede consultar la especificación de diff
    • En la mayoría de los casos, usar enlaces de bibliotecas es una mejor alternativa que depender de utilidades POSIX
    • En lugar de invocar grep, puede ser más eficiente usar algo como libpcre
    • En utilidades no POSIX como git, hg, rg, ag, tiene sentido usar opciones largas
  • No se debe mezclar la interpolación de cadenas con la ejecución de comandos

    • Hay que tener especial cuidado cuando el comando se procesa a través del shell
    • En cualquier lenguaje, se debe usar una API de ejecución basada en listas o arreglos para pasar los argumentos directamente a execv(2), execvp(2), etc.
  • Estoy de acuerdo en que se deben usar opciones largas, pero hay que considerar la portabilidad

    • No todas las distribuciones BSD admiten opciones largas al estilo GNU
    • Si quieres portabilidad, debes usar opciones cortas
  • No hay que olvidar usar -- después de todas las opciones y antes de los argumentos dinámicos

  • Antes de invocar un comando, hay que verificar si su longitud supera ARG_MAX

    • Por ejemplo, si tienes un comando como este:
      • grep --ignore-case --files-with-matches -- "hello" *.c
    • Debería invocarse así:
      • CMD="grep --ignore-case --files-with-matches -- \"hello\" *.c"
      • ARG_MAX=$(getconf ARG_MAX)
      • CMD_LEN=${#CMD}
      • if (( CMD_LEN > ARG_MAX )); then
      • echo "Error: Command length ($CMD_LEN) exceeds ARG_MAX ($ARG_MAX)." >&2
      • exit 1
      • fi
      • eval "$CMD" # Advertencia: evalúa los nombres de archivo
  • Estoy de acuerdo con este enfoque. Otra ventaja es que resulta más fácil buscar en la página del man qué hace cada opción

  • Si quieres que tu script sea portable a otros sistemas POSIX, quizá tengas que usar opciones cortas

    • Las opciones largas no están estandarizadas
    • Tienes que decidir tú mismo el trade-off
  • Las opciones deberían ir en líneas separadas para que sea más fácil rastrearlas y hacer git blame

  • Esta es una de las reglas básicas al escribir scripts. Si existen opciones largas, hay que usarlas

    • Es demasiado razonable hacerlo
  • Las opciones en formato largo son mucho más descriptivas para el lector

    • Se cometen menos errores tipográficos