Herramientas de línea de comandos para desarrolladores

Publicado: 2022-03-11

En el mundo en línea actual, la batalla para atraer usuarios continúa, y los creadores de aplicaciones prefieren aplicaciones móviles o web. Las aplicaciones de escritorio son cada vez menos relevantes. Además, también tienden a ser nada más que clientes ricos para aplicaciones web, siendo Electron la plataforma popular de elección.

¿Significa esto que pronto abandonaremos el escritorio como plataforma? No, por supuesto que no, yo no diría eso. Además, aunque las aplicaciones GUI parecen haberse estancado recientemente, hay un segmento de aplicaciones de escritorio que sigue creciendo.

¿Alguna vez has visto alguna película protagonizada por hackers? La mayoría de las veces, se muestra a estas personas trabajando frente a monitores que muestran algún tipo de terminal (generalmente con un fondo oscuro y un primer plano claro). Esta terminal, a su vez, tiende a estar inundada de personajes que pasan y que aparentemente tienen algún significado para la persona que los mira.

Ilustración: las herramientas de línea de comandos y la piratería se ven mejor en las películas que en la vida real

Tales representaciones de piratas informáticos en acción a menudo son burladas por desarrolladores profesionales, e incluso hay algunos programas que simulan varios efectos de "hacker", solo por diversión.

Sin embargo, en el mundo real, las herramientas de línea de comandos no se usan por su valor de entretenimiento.

Por qué todavía usamos herramientas de interfaz de línea de comandos

Este artículo se centra en el aspecto práctico del uso de herramientas de interfaz de línea de comandos (CLI). Conocer los comandos de CLI y usar herramientas de calidad puede aumentar su productividad y también puede abrir puertas a varios enfoques de automatización que son mucho más prácticos con interfaces de texto que con aplicaciones de GUI.

Puede mejorar en la realización de tareas repetitivas en la GUI, hasta el punto de que sus múltiples clics se escuchen como uno solo largo. El problema es que esto aún no superará la eficiencia de un script especializado. Además, realizar las mismas operaciones manualmente introduce una carga cognitiva adicional y una mayor posibilidad de error humano. Como de costumbre, confiamos en las computadoras para manejar tareas que los humanos pueden encontrar aburridas, repetitivas o abrumadoras.

Vale la pena saber que una herramienta de terminal puede ofrecer varios tipos de interfaces. Hay otros no interactivos como ls, que simplemente toman los parámetros y proporcionan la salida. Hay interfaces interactivas o semiinteractivas que se encuentran con mayor frecuencia en los administradores de paquetes. ("¿Está seguro de que desea continuar con la instalación desde una fuente no verificada?") Luego, existen interfaces de usuario textuales (TUI), que son aplicaciones GUI interactivas diseñadas para adaptarse a las limitaciones de una terminal. Probablemente el más famoso sea Midnight Commander (mc), un clon del extremadamente popular (en los años 90) Norton Commander.

Herramientas de línea de comandos esenciales

Si desea convertirse en un habitante de la consola, debe equiparse con un conjunto mínimo de herramientas de desarrollo de línea de comandos: lo esencial. Las cosas sin las que definitivamente no puede vivir son un caparazón interactivo (apunte a algo moderno con conveniente finalización de pestañas) y un editor de texto .

Ilustración: herramientas de línea de comandos esenciales

Ahora, mencionaré la filosofía UNIX , que a menudo es la base detrás de las decisiones de diseño que toman los autores de la herramienta, ya sea conscientemente o no. Algunos de los puntos clave se pueden resumir de la siguiente manera:

  • Trata todo como un archivo.
  • Haz una sola cosa, pero hazla bien.
  • Lea desde la entrada estándar, escriba en la salida estándar y comunique los errores a un flujo de errores estándar.
  • Cuando tenga éxito, devuelva el código 0. Un valor distinto de cero significa un error (que se puede especificar mediante el código de retorno exacto).
  • Permitir el encadenamiento de comandos y secuencias de comandos.

Cascarón

Lo primero que ves al abrir una terminal es un caparazón. Esta es la parte que hace posible la interacción entre el usuario y la máquina. Interpreta sus comandos, los divide en nombres de programa y argumentos, y ejecuta todos los comandos de shell que le lanza.

Históricamente, ha habido muchos tipos diferentes de conchas. Entre los más populares estaban csh (C Shell) y varias implementaciones de Bourne Shell (generalmente conocido simplemente como sh ). Bourne Shell se extendió a Korn Shell, que también ganó algo de tracción y todavía está siendo utilizado por sus entusiastas. Csh es actualmente el shell predeterminado en algunos sistemas BSD, mientras que casi todos los demás sistemas operativos similares a UNIX prefieren algún tipo de Bourne Shell. Las distribuciones de Linux tienden a favorecer a bash, mientras que Mac OS X viene con zsh como opción predeterminada.

Existen otras posibilidades, pero son mucho menos populares, excepto Microsoft PowerShell en sistemas Windows. PowerShell se inspira en parte en los shells UNIX interactivos como zsh y en parte en el tiempo de ejecución de .NET. En lugar de tratar todo como texto, un concepto común en el mundo UNIX, permite la manipulación de datos orientada a objetos.

Aunque Microsoft PowerShell es bastante popular en el ámbito de Windows, muchos programas con orígenes UNIX (los más notables son Git, Autotools o Make) tienden a preferir alguna variación de Bourne Shell. Debido a esto, nacieron proyectos como msys (incluido con Git para Windows), Cygwin o el reciente WSL de Microsoft. Si desea una sensación similar a la de Linux en Windows, MSys es la mejor opción aquí. Si desea un entorno Linux con todas las funciones capaz de ejecutar binarios estándar de Linux, entonces WSL es el camino a seguir. Para algo intermedio: API de UNIX pero compilada como un ejecutable de Windows (solo utilícela cuando realmente sepa por qué la necesita), Cygwin es la respuesta.

Editor

Una vez que te familiarices con tu caparazón, querrás aprender algunas habilidades útiles. Como la mayor parte del trabajo de codificación gira en torno a la escritura de texto (código, LÉAME, mensajes de confirmación), es esencial un buen conocimiento de los editores de texto interactivos. Hay muchos para elegir, y dado que un editor es una de las herramientas más necesarias para cualquier desarrollador, probablemente haya muchas opiniones sobre qué editor es el mejor.

Ilustración: un editor de línea de comandos tiene una interfaz simple

Los editores de texto más populares se pueden separar en dos grupos básicos: editores de texto simples y editores de texto programables .

Ambos pueden ser excelentes para escribir código, pero, como sugiere el nombre, los programables ofrecen la capacidad de configurar y personalizar el editor para que se adapte perfectamente a sus necesidades. Sin embargo, esto tiene un precio, ya que también tienden a tener una curva de aprendizaje más pronunciada y pueden requerir más tiempo para configurarse.

Editores de texto básicos

Entre los editores de texto simples, GNU Nano es el más extendido. En realidad, es un clon del pico editor, por lo que si uno no está disponible en su sistema, puede probar con el otro. Otra alternativa más moderna a ambos es el microeditor. Si desea algo simple y extensible al mismo tiempo, este es un buen lugar para comenzar.

Editores de texto programables

Muchos desarrolladores confían en editores programables de diferentes campos, como Vim y GNU Emacs. Ambos editores pueden ejecutarse en la consola o en modo GUI, y ambos tuvieron un impacto en las combinaciones de teclas que se encuentran en otro software. Ambos ofrecen no solo una API, sino también lenguajes de programación reales incorporados. Emacs se enfoca en LISP y Vim usa su propio VimL, ​​pero también ofrece interfaces para otros lenguajes de secuencias de comandos populares (como Lua, Perl, Python o Ruby). También vale la pena mencionar un enfoque más reciente de Vim, llamado Neovim, ya que está comenzando a tener muchos seguidores.

Puede ser algo confuso, pero también hay un editor llamado vi que es un predecesor de Vim (que, dicho sea de paso, significa " Vi i m prove"). Es mucho más simple que Vim, pero si tiene suficiente confianza para escribir en Vim, no debería ser un desafío para usted si necesita usar vi.

Dado que pico/GNU Nano y vi/Vim suelen estar preinstalados en varios sistemas, es una buena idea al menos comprender sus conceptos básicos (dejar Vim es un problema notoriamente difícil para los principiantes). De esta manera, si necesita editar algo en una máquina remota, estará listo independientemente del editor que ya esté allí. En su dispositivo privado, siéntase libre de usar cualquier editor que le resulte más cómodo.

Editor de sistema predeterminado

Una última cosa a tener en cuenta es que su sistema puede tener lo que se llama un editor predeterminado .

La variable de entorno $EDITOR apunta al editor predeterminado y en shells compatibles con Bourne (sh, bash, ksh, zsh) puede verlo ingresando echo $EDITOR . Si el valor difiere de su elección personal, puede establecerlo usted mismo agregando export EDITOR=my-awesome-editor a la configuración de tiempo de ejecución de su shell ( ~/.profile , ~./bashrc , ~/.zshrc , etc.).

Otros programas, como los sistemas de control de versiones y los clientes de correo, utilizarán este editor cuando necesiten una entrada de texto más larga.

multiplexor

Tan pronto como comience a hacer cosas serias en CLI, encontrará la limitación de poder mantener abierta solo una aplicación en un momento dado. Al codificar, es posible que desee editar el código, ejecutarlo, corregir los errores y volver a ejecutar. Al buscar un error, es posible que desee enumerar los registros y ver qué se registra cuando envía una solicitud al servidor. Por lo general, esto significaría cambiar constantemente entre las dos aplicaciones o abrir varias ventanas de terminal.

Aquí es donde un multiplexor de terminales puede ayudarlo. Cuando se habla de multiplexores, algunas personas asumen inmediatamente que el tema es GNU Screen. Fue la primera herramienta generalizada de este tipo y sigue siendo muy popular hoy en día (a menudo se instala de forma predeterminada). Su reemplazo moderno es tmux que, como era de esperar, significa " t erminal m ultiple x er".

Estos dos le permiten tener más de una ventana abierta en una sesión de terminal determinada y cambiar entre esas sesiones libremente. Le permiten dividir las ventanas en paneles, lo que ayuda a ejecutar varias aplicaciones al mismo tiempo y observar su salida en tiempo real (sin cambiar ninguna ventana). Además, funcionan en modo cliente-servidor, lo que significa que puede desconectarlos en cualquier momento y volver más tarde para continuar el trabajo justo donde lo dejó. Esta última característica condujo a la popularidad de Screen cuando la gente quería sesiones de IRC persistentes.

Para la mayoría de los casos de uso, GNU Screen o tmux deberían ser excelentes para usted, pero si por alguna razón considera que consumen demasiados recursos, también hay alternativas más ligeras. Hay dtach/atach y hay abduco. Tienen un alcance limitado a propósito, pero pueden desempeñar bien sus funciones respectivas.

Gerente de empaquetación

En este punto, puede comenzar a pensar en instalar todo el software mencionado anteriormente en su máquina. Un problema es que cada una de las herramientas tiene diferentes instrucciones de instalación. A veces, necesita descargar las fuentes y compilarlas usted mismo, a veces obtiene el binario autónomo y, a veces, obtiene lo que se llama un paquete binario , que generalmente significa un ejecutable comprimido junto con algunos metadatos.

Para facilitar el proceso de instalación de software, los creadores de sistemas operativos crearon un concepto de administradores de paquetes. En pocas palabras, un administrador de paquetes es como una tienda de aplicaciones para CLI y aplicaciones de escritorio. Precede a las tiendas de aplicaciones reales por algunas décadas. El problema es que casi todos los sistemas tienen su propio administrador de paquetes. Debian, Ubuntu y las distribuciones derivadas de GNU/Linux usan APT, las distribuciones basadas en Red Hat prefieren yum o DNF, otras distribuciones de Linux tienen medios más exóticos para instalar software, al igual que diferentes clones de BSD. Además de los administradores de paquetes incorporados, también hay administradores instalados por el usuario como Chocolatey para MS Windows y Homebrew para Mac OS X/macOS. Cuando desee escribir instrucciones sobre cómo instalar su programa, puede terminar escribiendo casos para cada uno de esos sistemas. Parece un poco demasiado, ¿no?

Afortunadamente, el último de los sistemas mencionados, Homebrew, puede ser el más portátil, gracias a Linuxbrew, un puerto de Homebrew para sistemas GNU/Linux. Lo curioso es que incluso funciona en WSL si desea tener una experiencia de usuario similar en Microsoft Windows. Sin embargo, tenga en cuenta que WSL no es oficialmente compatible.

Entonces, además de la portabilidad, ¿qué más puede ofrecer Homebrew? En primer lugar, no interfiere con los paquetes del sistema, por lo que todo lo que instala reside en una capa separada del sistema operativo. Además, normalmente no se necesitan permisos de root para instalar paquetes. Por lo tanto, puede tener paquetes de sistema que sean estables y probados, pero al mismo tiempo verifique sus versiones más nuevas sin sacrificar la estabilidad del sistema.

Si desea probar los editores, mencioné anteriormente que todo lo que necesita hacer en un sistema con Homebrew o Linuxbrew es ejecutar este comando:

brew install emacs micro nano vim neovim .

las cosas brillantes

Lo que ya hemos comentado es sin duda útil para el trabajo. Pero también hay aplicaciones que, aunque no son necesarias, aportan comodidad a la vida cotidiana. Puede que no los necesites, pero siempre vale la pena conocerlos.

Filtro interactivo

Buscar en el historial de comandos puede ser tedioso. Si bien tanto bash como zsh cuentan con la combinación de teclas Ctrl+R, solo muestra una sustitución a la vez. Además, debe ingresar el texto exacto que usó antes. Dado que esta es una operación bastante común, una vez que comienza a usar la línea de comando, parece un buen lugar para mejorar.

Los filtros interactivos, como fzy, percol, peco o fzf, lo ayudan a filtrar largas líneas de texto. Puede ser el historial de comandos antes mencionado, todas las líneas de código en un directorio de proyecto o una lista de nombres de archivos generados por find . . La idea general aquí es presentarle primero todas las líneas disponibles y luego confiar en los algoritmos de búsqueda difusa para filtrar todo lo que no coincida.

Por ejemplo, vincular Ctrl+R a fzf le muestra una lista de los comandos más recientes, que puede navegar hacia arriba y hacia abajo con flechas, o puede escribir git para mostrar solo los comandos que incluyen a Git en algún lugar dentro. Personalmente, cuando trabajo con un shell que no tiene un filtro interactivo, de repente me siento un poco perdido. ¡Esta característica es realmente convincente!

Además, puede hacer que su filtro interactivo esté disponible dentro de su editor de texto programable. De esta manera, tendrá capacidades de búsqueda unificadas entre su shell y su editor.

Navegador interactivo

Facebook PathPicker fue de gran ayuda cuando trabajaba principalmente con proyectos de C++. El registro de errores generado por el compilador puede volverse bastante grande y desagradable, y la capacidad de encontrar las rutas reales dentro de ese registro fue una gran ayuda para la productividad.

En cualquier archivo de texto dado, o el contenido de su pantalla cuando se usa con tmux, fpp filtra todo menos las rutas de los archivos. Luego presenta una interfaz de usuario donde puede seleccionar una o más de esas rutas y ejecutar un comando con ellas. La respuesta más común sería abrir los archivos en un editor, por supuesto, que es la acción predeterminada.

Interfaz de usuario de Git

Lo más probable es que al menos uno de los proyectos en los que trabaja utilice Git como sistema de control de versiones. Si bien es completamente poderoso, Git CLI no es el pináculo de una excelente experiencia de usuario. Para ahorrarle algo de estrés al leer todas las opciones en la ayuda de Git $SUBCOMMAND , le recomiendo que consulte tig. Ofrece una interfaz de usuario de consola agradable para las operaciones que se benefician de ella, como log o blame .

Otra herramienta que pretende ayudar a los usuarios de GIt es fac, que son las siglas de Fix All Conflicts . Como habrás adivinado, es útil cuando te encuentras con conflictos al hacer fusiones o rebases. Es una alternativa a otras herramientas de combinación como vimdiff.

Administrador de archivos

Hubo un tiempo en los años 90 cuando todo el mundo quería un administrador de archivos de dos paneles. La tendencia comenzó con Norton Commander. Muchos otros siguieron el mismo camino, pero el que todavía ve una base de usuarios estable es Midnight Commander. El caso de uso más obvio es usar mc para manipular archivos locales, pero también es muy útil cuando se trabaja con máquinas remotas.

Como la mayoría de los programas de línea de comandos, es muy liviano, por lo que no hay problema para ejecutarlo a través de ssh y, gracias a la compatibilidad con los protocolos FTP y FISH, puede tener un sistema de archivos local visible en un panel y el remoto en el otro: una práctica característica cuando desea evitar escribir o copiar nombres de archivos como argumentos para scp.

Herramientas CLI solo por diversión

“Todo el trabajo y nada de diversión hacen de Jack un niño aburrido” , dicen. Hay un montón de programas, línea de comandos y otros, que sólo sirven para su diversión. El videojuego Rogue entra en esta categoría. ¡Incluso dio nombre a todo el género de juegos! Otros juguetes populares son la fortuna y la vaca, que pueden hacer que su día sea un poco menos aburrido si los usa en algún lugar de sus scripts de CI, por ejemplo.

Pero para algunos de nosotros, el principal atractivo de usar una consola en primer lugar es sentirse como un hacker en las películas. No More Secrets y Hollywood Hacker representan bien a este grupo. ¡Pruébalo cuando alguien te esté viendo trabajar, y tu credibilidad como hacker seguramente aumentará!

Línea de comandos en la práctica

Entonces, ¿qué tiene de atractivo la línea de comandos que compensa las horas dedicadas a aprender a usar el shell, el editor y todos los interruptores de varias aplicaciones? La respuesta corta es la productividad , que proviene de dos cosas:

  • Una es que cuando se le presenta solo una ventana de terminal y nada más, puede concentrarse más intensamente, ya que no hay mucho que lo distraiga. No aparecen notificaciones, no hay anuncios, no hay imágenes de lindos gatitos. Solo tú y tu objetivo.

  • Lo segundo es la automatización. Puede poner varias acciones combinadas con frecuencia en un script y llamarlo más tarde como un todo en lugar de escribirlas todas a mano cada vez. Puede volver rápidamente a un comando particularmente complejo que escribió una vez buscando en el historial de su shell. Básicamente, puede grabar y reproducir cualquier cosa, y el código está disponible como documentación de lo que hizo.

La capacidad de agregar alias también contribuye a las ganancias. Por ejemplo, a menudo me encuentro elaborando compromisos en Git actualizando el mismo hasta que sea perfecto (por el momento). Una vez que organizo los archivos deseados, ejecuto git carmh . No intente buscarlo en el manual, ya que es mi alias privado que significa commit --amend --reuse-message=HEAD . Se ahorra algo de tipeo seguro.

La cosa es que la gente se aburre de repetir las mismas acciones una y otra vez, y el aburrimiento reduce el enfoque. Esto puede conducir a errores y errores. La única forma de evitarlos es no entrelazar acciones de alto y bajo enfoque. Escribir código es de gran importancia y revisar un mensaje de compromiso y el contenido es de gran importancia, pero cuando necesita repetir varios clics mecánicos aquí y allá para llegar a la etapa de revisión de compromiso, es probable que su enfoque disminuya. Por supuesto, la línea de comandos no está libre de tales actividades mecánicas, pero gracias a la automatización, puede evitar la mayoría de ellas.

Exploraciones adicionales

Es posible que ya conozca algunas o todas las herramientas de línea de comandos mencionadas en este artículo. Es posible que haya aprendido algo nuevo y útil mientras lo leía. Si es así, excelente. Mi objetivo aquí no era ofrecer una descripción general completa y una comparación de diferentes herramientas, sino demostrar algunas herramientas cruciales que he encontrado útiles en mi trabajo diario, con la esperanza de que algunas de ellas le resulten útiles. también.

Existen programas de línea de comandos mucho más interesantes, y si está interesado en ellos, le recomiendo consultar la lista seleccionada de Awesome Shell de algunas de las mejores herramientas de línea de comandos disponibles en la actualidad.

La mayoría de las aplicaciones GUI tienen su contraparte de terminal. Eso incluye navegadores web, clientes de correo electrónico, clientes de chat (IRC, Slack, XMPP), suites PIM u hojas de cálculo. Si conoce algún buen programa que no haya mencionado, menciónelo en los comentarios.