Aprendiendo a amar tu terminal

Introducción

Después de leer Introducción a la terminal de Linux y Introducción a la línea de comandos de Linux , debería tener una buena comprensión de los conceptos básicos para trabajar en un entorno de línea de comandos moderno. Sin embargo, muchos usuarios que son nuevos en la línea de comandos pueden encontrarla bastante restrictiva. Este tutorial está diseñado para estos usuarios para proporcionar más información sobre las interfaces de línea de comandos, así como consejos sobre personalización y portabilidad multiplataforma. El objetivo es sentirse tan cómodo en un entorno de terminal como lo está al usar una computadora de cualquier otra manera.

Dado que comenzar a usar una terminal en Windows puede ser menos intuitivo que en otras plataformas, la primera sección de este tutorial cubrirá los entornos de terminal de Windows. Si usa macOS o Linux, puede pasar a la siguiente sección.

Mejorando su experiencia en la terminal de Windows

En Windows, existen muchas opciones para un equivalente de Terminal. Históricamente, Windows no utilizaba shells de línea de comandos de estilo Unix, como bash, que han sido omnipresentes en macOS y Linux desde principios de la década de 2000. También carecía de funciones especiales para resaltar texto, abrir múltiples pestañas, etc. Esto se debe a que no utilizaba interfaces de terminal de línea de comandos comunes, a veces llamadas emuladores de terminal porque emulan las interfaces de computadoras más antiguas sin gráficos.

En cambio, Windows ofreció dos de sus propias interfaces de línea de comandos nativas: el Símbolo del sistema de Windows y, a partir de Windows 7, Microsoft PowerShell . El Símbolo del sistema, también llamado cmd.exe, utiliza la sintaxis heredada de MS-DOS con relativamente pocas adiciones. PowerShell proporciona una sintaxis algo más moderna en relación con cmd.exe(donde “moderno” en este contexto significa “más cercano a un shell moderno de macOS o Linux”), así como funciones de manejo de señales específicas para cierto software de Windows, lo que lo hace útil para los administradores de Windows.

Ninguno de estos shells de Windows incluye muchas de las características fundamentales de los shells de estilo Unix modernos y, por lo general, no son adecuados para la mayoría de los desarrollos en la nube. Debido a esto, los usuarios que necesitaban trabajar en servidores en la nube desde Windows generalmente instalaban software como PuTTY (a ttyes el nombre histórico de un terminal Unix), mobaXterm o ConEmu . Cada una de estas aplicaciones generalmente incluía su propia interfaz de terminal, así como un cliente SSH integrado para conectarse a servidores remotos. Estas dos características no suelen considerarse análogas en otras plataformas, pero en Windows, generalmente se suponía que si necesitabas un terminal de estilo Unix, ibas a trabajar en un servidor remoto, por lo que a menudo se empaquetaban juntas. Por esta razón, usar una GUI SSH dedicada como PuTTY sigue siendo una forma popular de trabajar con servidores en la nube desde Windows.

En otras plataformas, sshes simplemente un programa de línea de comandos que se puede ejecutar desde una terminal y forma parte de un grupo central de utilidades de Linux. También es posible instalar estas utilidades centrales de Linux en Windows, junto con un puerto del bashshell estándar. Originalmente, esta funcionalidad la proporcionaba el proyecto Cygwin , que incluye puertos de muchas otras herramientas del sistema Linux. La instalación de Git en Windows también proporciona su propio bashshell del proyecto MSYS2 , que comparte algunas funciones y código ascendente con Cygwin. Esto le permitiría, por ejemplo, sshdesde la línea de comandos en Windows, así como usar utilidades comunes de Linux como grepo cat, sin necesidad de otro programa para proporcionar esta funcionalidad.

Administradores de paquetes de Windows

Estos puertos de utilidades de Linux para Windows suelen ser robustos y bien mantenidos. Sin embargo, tienen un par de desventajas significativas que los han hecho menos populares que el uso de funcionalidades similares en macOS o Linux. Una es que generalmente no incluyen administradores de paquetes completos para instalar otro software de línea de comandos según sea necesario, lo cual es un supuesto básico de la mayoría de los entornos Linux (también proporcionado por herramientas como Homebrew en macOS). En los últimos años, Windows ha ganado su propio ecosistema de administradores de paquetes de línea de comandos, como Chocolatey y Scoop , que se pueden usar con bashel shell de Git u otros entornos. Al igual que Homebrew en macOS, estos son especialmente útiles en una máquina local porque se pueden usar para instalar software de escritorio además de herramientas de línea de comandos. Sin embargo, debido a que la mayoría del software en la nube aún no está diseñado para ejecutarse de forma nativa en Windows, los repositorios de paquetes de Chocolatey y Scoop a menudo son menos completos que sus equivalentes de macOS o Linux. Su uso a menudo requiere que traduzca la documentación de instalación escrita para plataformas más comunes a un equivalente funcional de Windows, lo que los hace poco intuitivos para los usuarios principiantes.

La otra desventaja es que PuTTy, Git Bash y otros entornos de terminal de Windows todo en uno suelen tener características de interfaz de usuario muy básicas, sin soporte para resaltado de sintaxis o pestañas. Debido a que el símbolo del sistema de Windows no ha mejorado visiblemente durante algún tiempo, los usuarios de Windows pueden verse obligados a adoptar flujos de trabajo más complicados que los usuarios de un terminal moderno como iTerm2 en macOS. Para aproximarse a un entorno como este, podría combinar bashel shell de Git, el administrador de paquetes de Chocolatey y la personalización de terminal de ConEmu. Esto produce un resultado muy útil, pero requiere una configuración única que puede considerarse frágil o menos reproducible que otras plataformas.

Nota: También es posible abrir varias pestañas dentro de un único shell sin necesidad de depender de ninguna característica adicional del emulador de terminal mediante el uso de un multiplexor de terminal como tmux . Sin embargo, esto suele tener una curva de aprendizaje más alta que el uso de las características a nivel de aplicación.

Hoy en día, se puede utilizar el nuevo Windows Terminal junto con WSL2 , también llamado Subsistema de Windows para Linux . Estos dos proyectos resuelven sustancialmente muchos problemas pendientes. El Windows Terminal proporciona una funcionalidad similar a ConEmu, como pestañas, resaltado y representación de texto moderna, y se puede utilizar con cualquier shell instalado. También se instala de forma predeterminada en Windows 11, lo que reduce significativamente la barrera de acceso y la necesidad de herramientas de terceros para realizar este trabajo. WSL2 logra un objetivo relacionado: al permitir a los usuarios instalar un entorno de compatibilidad con Linux que se ejecuta dentro de Windows y es compatible directamente con Microsoft, ya no necesitan (en su mayoría) considerar todo el conjunto de otras herramientas de línea de comandos de Windows.

WSL2 es un entorno Linux completo que se ejecuta dentro de Windows. Debido a que no es un puerto de herramientas Linux para Windows, viene con ventajas significativas. Cuando se trabaja dentro de un entorno WSL2, puede usar aptHomebrew o cualquier otra herramienta nativa de Linux para instalar y ejecutar software exactamente como lo haría en un servidor en la nube. Esto también tiene algunas desventajas. A diferencia de una terminal macOS o Linux, no puede ejecutar software de escritorio nativo desde WSL2, solo software Linux que esté instalado en su entorno Linux. En muchos casos, esto será suficiente, especialmente si usa principalmente su terminal para implementar software en servidores remotos o hacer pequeños cambios de configuración. Sin embargo, es posible que aún desee configurar Windows Terminal para iniciar varios entornos de shell diferentes según sus necesidades: por ejemplo, uno que use Git Bash y Chocolatey, que funciona con su software nativo de Windows, y otro que use WSL2, que proporciona un administrador de paquetes completo y le permite seguir la documentación de Linux tal como está. Muchas de estas herramientas ahora tienen soporte mutuo integrado, lo que hace que esto sea relativamente sencillo y muy poderoso.

zsh y otros intérpretes de shell

Aunque bashes el shell más común en las distribuciones modernas de Linux, y su sintaxis se considera la más compatible con la mayoría de los entornos, no es el único. La sintaxis de Bourne Shell , o /bin/sh, es un subconjunto de bash, y a veces todavía se usa en entornos mínimos como los contenedores. También está el shell Z, o zsh, que se está volviendo más popular debido a su licencia MIT más flexible y su configurabilidad. A partir de 2020, es el shell de Terminal predeterminado en macOS, y está ampliamente disponible en otros entornos.

Nota: Puede cambiar su shell predeterminado en cualquier entorno de línea de comandos moderno mediante el comando chsh . Esto le permite cambiar entre bash, zsh, u otros.

Zsh proporcionó un soporte más amplio y temprano para la creación de temas, el resaltado de texto y la representación de caracteres no textuales (también llamados glifos , esencialmente una forma anterior de Emoji) que el bashshell predeterminado en muchos entornos. Debido a esto, existe un ecosistema más grande de herramientas de personalización de terminal para Zsh, como Oh My Zsh . Más importante aún, las herramientas y la documentación de Zsh generalmente priorizan la instalación de fuentes con soporte para glifos complejos, como las fuentes Powerline , lo que resulta útil para resolver problemas de representación de texto en otros entornos.

Una desventaja que los potenciales usuarios de Zsh se dan cuenta rápidamente es que zshy bashno tienen una sintaxis estrictamente idéntica, y bashlos scripts de shell son los más comunes con diferencia. Si bien la mayoría de las convenciones de shell cotidianas para navegar por directorios son las mismas, surgen algunas diferencias. Esto incluye probar la equivalencia con operadores de comparación , cadenas de búsqueda complejas en el sistema de archivos, etc.

Como regla general, si está escribiendo un script de shell con una sintaxis más compleja de lo que bashse puede acomodar, debería considerar un lenguaje de script diferente. La sintaxis de shell es poderosa, pero también puede ser difícil de manejar. El lenguaje Go , por ejemplo, se ha vuelto popular para escribir herramientas de línea de comandos que utilizan un control de flujo más avanzado que el apropiado para scripts de shell. Con algunas excepciones, incluso los usuarios dedicados de Go zshno suelen escribir ni mantener zshscripts independientes.

Teniendo esto en mente, no deberías preocuparte por ningún problema de compatibilidad que surja al usar zshcomo tu shell interactivo predeterminado. Prácticamente todos los entornos en los que puedes ejecutar zshtambién tendrán el bashintérprete instalado para ejecutar cualquier bashscript según sea necesario. Cuando estás escribiendo un script de shell independiente o ejecutando un script de shell que descargaste de otro lugar, la primera línea normalmente contendrá #!/bin/bash. Esto se conoce como shebang , o una directiva de intérprete , que le dice a la computadora qué programa o intérprete usar para ejecutar el script de manera predeterminada. Esto es especialmente importante para los scripts de shell que de otra manera no se pueden distinguir por su extensión de archivo: tanto bashlos scripts como otros scripts de shell terminan en .sh. Debido a que bashsiempre se instala en /bin/bashen entornos compatibles (incluido Git Bash en Windows), proporcionar una ruta completa aquí es una convención generalizada y segura.

Mejorando la búsqueda con Globstars

Un ejemplo de sintaxis avanzada de shell que se admite en zshde forma predeterminada, pero que se debe habilitar manualmente en bash, es el globstar o **patrón. Globbing es otro nombre para realizar búsquedas de coincidencias aproximadas, es decir, buscar archivos utilizando *caracteres comodín. El **globstar le permite utilizar la sustitución de comodines no solo dentro de un solo nombre de archivo, sino también para directorios completos. Por ejemplo, si estuviera buscando un archivo nombrado en config.txtalgún lugar de su directorio de inicio, pero no supiera dónde buscar, es posible que necesite utilizar un comando como find, que está diseñado para buscar recursivamente en directorios anidados. Incluso si ya conoce findla sintaxis, esto agregaría un paso adicional a su proceso en el que de lo contrario podría haber utilizado un comodín.

Al usar un globstar, podría proporcionar una ruta como ~/**/config.txtcualquier otro comando. El shell ampliaría automáticamente la búsqueda por usted, sin necesidad de invocarlo finddirectamente. Los shells son buenos para proporcionar este tipo de funcionalidad: lo que normalmente requeriría una dependencia entera se puede incorporar en una única sustitución de carácter adicional. Para habilitar el uso de globstar, bash,puede ejecutar shopt -s globstar.

  1. shopt -s globstar

También puede experimentar con cadenas de búsqueda global utilizando la herramienta Global de DigitalOcean .

Mejorando las utilidades principales de tu terminal con Rust

Como se mencionó, el lenguaje Go se ha vuelto muy poderoso para crear herramientas de línea de comandos modernas. Otro lenguaje de programación relativamente nuevo que es especialmente relevante para los entornos de línea de comandos es Rust . Rust es un lenguaje de bajo nivel que generalmente se considera similar a C++ y otros lenguajes similares a C, pero con una sintaxis mucho más moderna y menos del bagaje acumulado de C. Rust es popular para muchos casos de uso, incluido WebAssembly , pero es particularmente útil para reescribir código C.

Casi todas las utilidades básicas que se consideran esenciales para los entornos de línea de comandos, como ssh, curly cat, están escritas en lenguaje C , en muchos casos desde hace varias décadas. Es por eso que muchas de ellas tienen tantas docenas de opciones que se han agregado a lo largo de años de mantenimiento activo. En muchos sentidos, Linux se ha construido en torno a estas herramientas específicas, y es poco probable que alguna vez sean reemplazadas oficialmente. Sin embargo, ha habido esfuerzos recientes para desarrollar versiones mejoradas de cada una de ellas utilizando Rust.

Nota: “Utilidades básicas”, o coreutils , se considera generalmente el nombre real de esta colección de programas. Se suele suponer que muchos de ellos son comandos de terminal reales en lugar de programas; por ejemplo, cdes una sintaxis de terminal, mientras que cates un programa pequeño y reemplazable. En macOS, incluso puedes usar el administrador de paquetes Homebrew para reemplazar el coreutils integrado de macOS por el más común coreutils de GNU/Linux .

Por ejemplo, bat proporciona más resaltado de sintaxis y características similares a cat, dust es similar a usar dupara verificar el uso del disco pero con una salida gráfica más sofisticada, y ripgrep , o rg, es una implementación mucho más rápida de grep.

Las ventajas relativas de estas nuevas herramientas de Rust no deben tomarse como un juicio sobre C o Rust en sí mismos, o sobre su desempeño relativo. Más bien, son una consecuencia de mantener las mismas bases de código durante mucho tiempo. Muchas utilidades básicas de Linux no priorizan la velocidad y, en la mayoría de los casos, el mantenimiento de estas utilidades consiste en garantizar que no rompan la compatibilidad con ninguna funcionalidad heredada. La mayoría de estas utilidades de Rust se han agregado a los administradores de paquetes de diferentes plataformas, pero aún se las trata como nuevas y opcionales.

Perfiles y alias

La desventaja más importante de estas nuevas herramientas de Rust es que muchas personas pueden olvidarse de usarlas, ya que sus hábitos de uso catse greparraigarán rápidamente. Para solucionar este problema o para personalizar aún más el entorno de shell en general, puede utilizar un archivo de perfil .

Ambos archivos de perfil son compatibles. Un archivo de perfil es un archivo en su directorio de inicio llamado basho para bash, o para zsh. A menudo, se crean automáticamente cuando inicia su shell por primera vez, pero como comienzan con un carácter, el sistema los trata como ocultos y permanecen invisibles a menos que se editen directamente. Los archivos de perfil pueden contener una serie de configuraciones que ayudan a inicializar su entorno de shell, como alias de un comando a otro.zsh.bash_profile.bashrc.zshrc.

Con este método, puedes crear un alias en tu ~/.bash_profilepara que el grepcomando siempre se ejecute rgen lugar de tu sistema grep. Como se mencionó, estas herramientas de Rust no suelen instalarse de forma predeterminada, por lo que primero deberás instalar rg. Si estás usando Homebrew, puedes instalarlo desde el paquete ripgrep proporcionado .

  1. brew install ripgrep

A continuación, ábrelo ~/.bash_profilecon nanotu editor de texto favorito. Es posible que este archivo ya exista o no si ya tienes configuradas algunas opciones de perfil.

  1. nano ~/.bash_profile

Luego, agregue una línea al final del archivo que incluya el aliascomando:

~/.bash_perfil

…alias grep='rg'

Guarde y cierre el archivo, luego cierre y abra una nueva bashterminal. A partir de ahora, cuando ejecute grep, obtendrá rgen su lugar:

  1. grep --version
Outputripgrep 12.1.1-SIMD -AVX (compiled)+SIMD +AVX (runtime)

Debes tener en cuenta que si copias y pegas un grepcomando que encuentres en otro lugar y utiliza una funcionalidad que no está presente en rg, es posible que no funcione correctamente. Por este motivo, debes utilizar alias con moderación. Sin embargo, son útiles para crear atajos que no reemplacen por completo otros comandos. Por ejemplo, el entorno de programación Python viene con un servidor web integrado que puede servir a cualquier sitio estático pequeño ejecutando . Si utilizas esta función con frecuencia, es posible que quieras crear un alias similar a .python -m http.server port_numberalias pyserver="python -m http.server 8000"

Nota: Los alias en ~/.bash_profileno anularán ningún comando en scripts bash independientes, porque su ~/.bash_profilesolo se carga en shells bash interactivos de manera predeterminada. Puede cargar su manualmente ~/.bash_profileusando el comando source ~/.bash_profile, pero generalmente es mejor por razones de compatibilidad ejecutar scripts independientes en un entorno estándar.

Cada sesión de terminal se configura con una serie de variables de entorno de forma predeterminada. Muchas de ellas las configura automáticamente el sistema, pero puede proporcionar modificaciones adicionales en ~/bash_profile, o de forma interactiva dentro de una única sesión de shell. Para ver sus variables de entorno actuales, ejecute env:

  1. env
OutputSHELL=/usr/local/bin/bashITERM_PROFILE=bashCOLORTERM=truecolorXPC_FLAGS=0x0TERM_PROGRAM_VERSION=3.4.15…

Muchos de estos contienen información sobre el propio shell, que no será particularmente útil. Una excepción a esto es la PATHvariable, que contiene una lista de todos los directorios que se comprueban automáticamente para ejecutar programas de línea de comandos. Puede usar la línea de comandos para grepmostrar solo la línea que contiene la PATHvariable del envcomando:

  1. env | grep PATH
OutputPATH=/usr/local/opt/mysql-client/bin:/Users/sammy/.gem/ruby/3.0.0/bin:/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/Users/sammy/.cargo/bin:/Users/sammy/.rbenv/shims:/Users/sammy/.pyenv/shims:/Users/sammy/.pyenv/bin:/Users/sammy/Library/Python/3.9/bin:/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/sbin:/usr/local/opt/libpq/bin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/opt/findutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

Tenga en cuenta que los directorios de esta lista están separados por un :carácter. En general, su variable PATH será más larga en Windows o macOS que en Linux. Linux intenta imponer la instalación de programas de línea de comandos solo en directorios como bino /usr/local/bin, mientras que el software de Windows y Mac a menudo se instala en otros directorios que deben agregarse a su PATH para que esos comandos estén disponibles en la línea de comandos. La instalación de software a través de un administrador de paquetes generalmente se encarga de esto. Si bien puede mover manualmente los programas a /usr/local/bino a otro directorio en su ruta, tenga en cuenta que los administradores de paquetes esperan poder manipular el contenido de estos directorios. Cualquier programa que instale manualmente podría sobrescribirse o provocar un error al intentar sobrescribirse.

Puede comprobar la ubicación de instalación de un programa de línea de comandos mediante el whichcomando:

  1. which python
Output/Users/sammy/.pyenv/shims/python

Esto es útil para verificar qué versión de un programa se ejecutará de manera predeterminada cuando, por ejemplo, pythonse ejecuta desde la línea de comandos. Si un programa está presente en varios directorios en su PATH, el directorio que aparece primero en su variable PATH tendrá prioridad. Python es un ejemplo conocido. Debido a que macOS y Linux incluyen una versión de Python con el sistema que a veces se actualiza con demasiada frecuencia o con poca frecuencia, las herramientas como pyenv están diseñadas para registrar una instalación separada de Python lo antes posible en su ruta. Esto garantiza que siempre esté trabajando directamente con las bibliotecas adicionales para pyenvPython proporcionadas e instalándolas.

Cada vez que no obtengas el resultado esperado de un comando, plantéate estas preguntas:

  • ¿El programa que quieres ejecutar está en tu ruta?
  • ¿Se suponía que un administrador de paquetes debía colocarlo en su ruta cuando lo instaló, o necesita colocarlo allí manualmente?
  • ¿Es esta la única versión de este programa con este nombre exacto en su computadora?

El comportamiento de la herencia de variables de su PATH y su entorno de shell suele ser sencillo; es posible que tenga varios programas que hagan suposiciones contradictorias. Saber cómo comprobar y configurar su entorno le ayudará mucho a sentirse cómodo en la línea de comandos.

Conclusión

En este tutorial, repasó muchos matices de los entornos de terminal, incluida la configuración en Windows, las diferencias entre bashshells y otros, las utilidades de línea de comandos modernas y las variables de entorno, incluidas las rutas y los alias. Los desarrolladores nuevos pasan por alto muchos de estos aspectos, y cada uno de ellos puede hacer que trabajar de forma local o en la nube sea mucho más agradable y eficaz.

A continuación, es posible que desee aprender a trabajar con el cliente de línea de comandos de DigitalOcean, doctl .

SUSCRÍBETE A NUESTRO BOLETÍN 
No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio