Aprende lo básico de Linux para ser productivo

Diferentes sistemas operativos han estado atendiendo a diferentes audiencias durante mucho tiempo: Windows para profesionales de negocios, Mac para creativos y Linux para desarrolladores. Para los desarrolladores de sistemas operativos, este tipo de espectro de mercado ha simplificado en gran medida el concepto del producto, los requisitos técnicos, la experiencia del usuario y la dirección del mercado. Sin embargo, también ha endurecido las normas del entorno de trabajo, lo que ha llevado a que los usuarios se vean limitados a áreas estrechas y no superpuestas: los empresarios no tienen la oportunidad de participar en el proceso creativo y los desarrolladores no tienen idea de los problemas empresariales.
En realidad, el conocimiento y la experiencia son dinámicos, abarcan varias disciplinas y áreas de actividad. La idea de que "solo puedes tener habilidades en una cosa" no es una guía para dominar una habilidad, sino un intento de lidiar con una optimización prematura. Solo puedes saber en qué eres bueno cuando te has probado en diferentes áreas. Y puede resultar que tengas habilidades para muchas actividades diferentes.

Para los analistas de negocios modernos, la eliminación de la brecha entre el negocio y el desarrollo es especialmente relevante. Los analistas de negocios deben ser bilingües, capaces de usar la línea de comandos disponible solo en Linux (o macOS), pero también de aprovechar las amplias capacidades de Microsoft Office en Windows. Es evidente que el mundo de Linux asusta a aquellos que tienen una formación en negocios. Afortunadamente, al igual que en muchos otros casos, solo necesitas aprender el 20% de la información para hacer el 80% del trabajo. Aquí está mi 20%.
Por qué los analistas de negocios modernos deben conocer Linux

Gracias a sus raíces de código abierto, Linux ha cosechado las contribuciones de miles de desarrolladores a lo largo de su existencia. Han construido programas y utilidades para facilitar su propio trabajo y el de los programadores que les siguieron. Como resultado, el desarrollo de código abierto ha creado un efecto de red: cuanto más desarrolladores construían utilidades en la plataforma original, más otros desarrolladores podían influir en esas utilidades para escribir sus propios programas.

El resultado es un gran paquete de programas y utilidades (es decir, software) que se ha escrito en Linux y para Linux. La mayoría de ellos nunca se han portado a Windows. Un ejemplo de esto es el popular sistema de control de versiones llamado git. Los desarrolladores podrían haber escrito software para Windows, pero no lo hicieron. Lo escribieron para trabajar en la línea de comandos de Linux porque Linux es un ecosistema que ya tenía todas las herramientas necesarias.

Si profundizamos en los detalles, el desarrollo en Windows presenta dos problemas principales:
  • 1
    Las tareas básicas, como el análisis de archivos, la planificación de trabajo y la búsqueda de texto, se utilizan con más frecuencia que la ejecución de comandos en la línea de comandos.
  • 2
    Los lenguajes de programación (Python, C++) y las bibliotecas relacionadas arrojan errores porque esperan parámetros específicos de Linux o ubicaciones específicas del sistema de archivos.
Si juntamos todo esto, resulta en una pérdida de tiempo al tener que reescribir herramientas básicas que ya están disponibles en Linux y que evitan problemas de compatibilidad con el sistema operativo. No hay sorpresas aquí: el ecosistema de Windows simplemente no fue diseñado para satisfacer las necesidades del desarrollo de software.
Ahora, echemos un vistazo a los conceptos básicos de Linux.
La unidad fundamental de Linux: "shell"

La shell (también conocida como terminal, consola o línea de comandos) es la interfaz de texto a través de la cual se envían comandos a la máquina. En Linux, el lenguaje de la shell se llama bash. A diferencia de los usuarios de Windows, que en su mayoría navegan haciendo clic en las ventanas, los desarrolladores de Linux están atados al teclado y escriben comandos en la shell. Si bien esta transición puede ser poco natural para aquellos sin experiencia en programación, los beneficios de desarrollar en Linux superan con creces la inversión inicial en aprendizaje.
Aprendiendo algunos conceptos importantes

En comparación con un lenguaje de programación bastante maduro, bash tiene solo unos pocos conceptos principales que debes aprender. Una vez que los domines, el resto de bash es simplemente memorización. Para ser más claro: dominar bash significa memorizar 20-30 comandos y sus argumentos más utilizados.

Linux puede parecer inaccesible para aquellos que no están familiarizados con el desarrollo debido a la forma en que los desarrolladores (sin esfuerzo) arrojan comandos esotéricos en la terminal cuando les apetece. La verdad es que solo conocen unos pocos comandos: para todo lo demás, como cualquier mortal, recurren a Google.

Dejando de lado las pequeñas complicaciones en el camino, aquí están los conceptos clave de bash.
Sintaxis de comando

Los comandos siguen la sintaxis: {command} {arguments..}

Por ejemplo, en 'grep -inr', grep es el comando (para buscar una cadena de texto) y -inr son las banderas/argumentos que modifican lo que grep hace de forma predeterminada. La única forma de entender qué significa esto es buscar información sobre ellos en Google o simplemente escribir 'man grep'. Recomiendo aprender los comandos y sus argumentos más utilizados: es demasiado difícil recordar qué hace cada bandera.
Alias de directorios
  • Directorio actual (¿dónde estoy?): .
  • Directorio padre del directorio actual: ..
  • Directorio de inicio del usuario: ~
  • Raíz del sistema de archivos (o el padre de todos los padres): /
Por ejemplo, para cambiar al directorio padre, debes escribir: cd ..

De manera similar, para copiar un archivo ubicado en "/ruta/al/archivo.txt" al directorio actual, debes escribir cp /path/to/file.txt . (nota el punto al final del comando). Dado que estos son solo alias, también puedes usar la ruta real en lugar de ellos.
Información útil

Tenemos varios cursos disponibles, los usuarios registrados pueden realizarlos gratuitamente en este enlace.
STDIN / STDOUT

Todo lo que escribes en la ventana y confirmas (presionando ENTER) se llama entrada estándar (STDIN).

Todo lo que el programa muestra en respuesta en la terminal (por ejemplo, texto de un archivo) se llama salida estándar (STDOUT).

Tuberías (piping)
  • 1
    |

    La tubería toma STDOUT del comando a la izquierda de la tubería y lo convierte en STDIN para el comando a la derecha de la tubería.

    Ejemplo: echo 'test text' | wc -l
  • 2
    >

    El símbolo "mayor que" toma STDOUT del comando a la izquierda y lo escribe/sobrescribe en un nuevo archivo a la derecha.

    Ejemplo: ls > tmp.txt
  • 3
    >>

    Dos símbolos "mayor que" toman STDOUT del comando a la izquierda y lo añaden a un archivo nuevo o existente a la derecha.

    Ejemplo: date >> tmp.txt
Patrones de búsqueda (wildcards)

Puedes pensar en ellos como el carácter % en SQL. Por ejemplo, puedes escribir WHERE first_name LIKE 'John%' para encontrar cualquier entrada que comience con el nombre John.

En bash, puedes escribir John*. Si quieres mostrar una lista de todos los archivos en un directorio que terminen en ".json", escribes: ls *.json
Completado con TAB

Bash a menudo completa los comandos automáticamente según una lógica determinada cuando comienzas a escribir un comando y presionas TAB.

Sin embargo, vale la pena probar algo como zsh o fish para la autocompletación, ya que recordar los comandos y todos sus argumentos es muy difícil. Además, estas herramientas ofrecen autocompletado basado en tu historial de comandos.
Salir

A veces te quedas atrapado en algún programa y no puedes salir. Esto es algo que ocurre con mucha frecuencia para los principiantes en Linux y puede ser muy desmotivador. A menudo, la salida se logra con algo que contiene la letra q. Es bueno recordar lo que se muestra a continuación y usarlo cuando te encuentres atrapado.
  • Bash
    • CTRL+c
    • q
    • exit
  • Python: quit()
  • Nano: CTRL+x
  • Vim: :q!
Lo que recuerdo de los comandos de bash

Estos son los comandos que uso con más frecuencia en Linux (desde los más utilizados hasta los menos utilizados). Como mencioné antes, conocer solo un puñado de comandos te permitirá realizar una amplia variedad de tareas programables.
    • cd {directory} cambiar de directorio
  • ls -lha mostrar el contenido del directorio en forma de lista (detallada)
  • vim o nano editor de línea de comandos
  • touch {file} crear un nuevo archivo vacío
  • cp -R {original_name} {new_name} copiar un archivo o directorio (y todo su contenido)
  • mv {original_name} {new_name} mover o renombrar un archivo
  • rm {file} eliminar un archivo
  • rm -rf {file/folder} eliminar un archivo o carpeta sin posibilidad de recuperación [usar con cuidado]
  • pwd mostrar el directorio de trabajo actual
  • cat o less o tail o head -n10 {file} mostrar el contenido de un archivo en STDOUT
  • mkdir {directory} crear un directorio vacío
  • grep -inr {string} buscar una cadena en cualquier archivo en este directorio o en sus subdirectorios
  • column -s, -t <delimited_file> mostrar un archivo delimitado por columnas
  • tree -LhaC 3 mostrar la estructura de un directorio hasta 3 niveles de profundidad (con tamaños de archivo y directorios ocultos)
  • htop (o top) administrador de tareas
  • pip install --user {pip_package} gestor de paquetes de Python para instalar paquetes en ~/.local/bin
  • pushd . ; popd ; dirs; cd - push/pop/view directorio en la pila + cambiar de nuevo al último directorio
  • sed -i "s/{find}/{replace}/g" {file} reemplazar una cadena en un archivo
  • find . -type f -name '*.txt' -exec sed -i "s/{find}/{replace}/g" {} \; reemplazar una cadena en cada archivo en este y en los subdirectorios con un nombre que coincida con *.txt
  • tmux new -s session, tmux attach -t session crear una nueva sesión de terminal sin abrir una nueva ventana [nivel avanzado]
  • wget {link} descargar una página web o recurso web
  • curl -X POST -d "{key: value}" http://www.google.com enviar una solicitud HTTP a un servidor web
  • find <directory> mostrar una lista de todo el contenido de un directorio y sus subdirectorios de forma recursiva
Comandos avanzados y poco utilizados

Creo que es una buena práctica mantener una lista de comandos útiles en situaciones específicas, incluso si esas situaciones ocurren con poca frecuencia (por ejemplo, qué proceso está bloqueando un puerto de red específico). Aquí tienes algunos comandos no estándar que siempre tengo a mano:
  • lsof -i :8080 mostrar una lista de descriptores de archivos abiertos (-i es una bandera para interfaces de red)
  • netstat | head -n20 mostrar una lista de sockets de red/UNIX abiertos y la información relacionada
  • dstat -a transmitir actividad actual de disco, red, CPU, etc.
  • nslookup <IP address> buscar el nombre de host para una dirección IP remota
  • strace -f -e <syscall> <cmd> rastrear las llamadas al sistema de un programa (-e es una bandera para filtrar llamadas al sistema específicas)
  • ps aux | head -n20 mostrar los procesos activos actuales
  • file <file> verificar el tipo de archivo (por ejemplo, ejecutable, binario, archivo de texto con codificación ASCII)
  • uname -a información sobre el kernel del sistema operativo
  • lsb_release -a información sobre el sistema operativo
  • hostname verificar el nombre de host de la computadora actual (por ejemplo, el nombre que otros equipos pueden usar para acceder al tuyo)
  • pstree visualizar los procesos secundarios
  • time <cmd> ejecutar un comando y generar estadísticas sobre cuánto tiempo llevó ejecutarlo
  • CTRL + z ; bg; jobs; fg enviar un proceso a segundo plano en el tty actual y volver a traerlo al primer plano
  • cat file.txt | xargs -n1 | sort | uniq -c contar la cantidad de palabras únicas en un archivo
  • wc -l <file> contar el número de líneas en un archivo
  • du -ha mostrar el tamaño en disco de directorios y su contenido
  • zcat <file.gz> mostrar el contenido de un archivo de texto comprimido
  • scp <user@remote_host> <local_path> copiar un archivo desde un servidor remoto a local o viceversa
  • man {command} mostrar el manual (es decir, la documentación) para un comando (aunque es más fácil usar Google)
Este es un artículo de Alex Petralia Learn just enough Linux to get things done.
Leer otros artículos de Blog
Lee otros artículos relevantes del mundo de la tecnología y el espíritu empresarial.