<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ bash - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ bash - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 13:56:23 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/bash/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Aprender Linux para Principiantes: Desde las Bases a Técnicas Avanzadas [Libro Completo] ]]>
                </title>
                <description>
                    <![CDATA[ Aprender Linux es una de las habilidades más valiosas en la industria de la tecnología. Te ayuda a realizar las tareas más rápidamente y de manera más eficiente. Muchos de los servidores poderosos y supercomputadoras del mundo ejecutan Linux. Mientras que te fortalece en tu rol actual, aprender Linux también ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/learn-linux-for-beginners-from-basics-to-advanced-techniques-full-book/</link>
                <guid isPermaLink="false">66bbd9a1d77ca5042ec0cb1f</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Wed, 09 Oct 2024 14:35:10 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/08/764782a4-1bf3-45a5-857c-7fe3921bfb08.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Aprender Linux es una de las habilidades más valiosas en la industria de la tecnología. Te ayuda a realizar las tareas más rápidamente y de manera más eficiente. Muchos de los servidores poderosos y supercomputadoras del mundo ejecutan Linux.</p><p>Mientras que te fortalece en tu rol actual, aprender Linux también te puede ayudar en transicionar a otras carreras tech como DevOps, Ciberseguridad, y Computación en la Nube.</p><p>En este manual, aprenderás las bases de la línea de comandos de Linux, y luego transitaremos a temas más avanzados como <em>programación de scripts</em> y administración de sistema. Sea que eres nuevo en Linux o que ya has estado usándolo por años, este libro tiene algo para ti.</p><p><strong>Nota Importante</strong>: Todos los ejemplos en este libro son mostrados en Ubuntu 22.04.2 LTS (Jammy Jellyfish). La mayoría de las herramientas de línea de comandos son más o menos los mismos en otras distribuciones. Sin embargo, algunas aplicaciones de escritorio (GUI) y comandos podrían diferir si estás trabajando en otra distribución de Linux.</p><h2 id="tabla-de-contenidos">Tabla de Contenidos</h2><p><a href="#parte-1-introduccion-linux">Parte 1: Introducción a Linux</a></p><ul><li><a href="#comenzando-linux">1.1. Comenzando con Linux</a></li></ul><p><a href="#parte-2-introduccion-bash">Parte 2: Introducción al Shell de Bash y los Comandos de Sistema</a></p><ul><li><a href="#comenzando-shell-bash">2.1. Comenzando con el shell de Bash</a></li><li><a href="#estructura-comando">2.2. La Estructura de Command</a></li><li><a href="#comandos-bash-y-atajos">2.3. Comandos de Bash y Atajos de Teclado</a></li><li><a href="#comando-whomai">2.4. Identificándote: El Comando <code>whoami</code></a></li></ul><p><a href="#parte-3-entendiendo-sistema-linux">Parte 3: Entendiendo tu Sistema de Linux</a></p><ul><li><a href="#descubriendo-tu-so-y-especificaciones">3.1. Descubriendo tu SO y Especificaciones</a></li></ul><p><a href="#parte-4-manejando-archivos-desde-el-cli">Parte 4: Manejando Archivos desde la Línea de Comando</a></p><ul><li><a href="#la-jerarquia-del-sistema-archivos-linux">4.1. La Jerarquía del Sistema de Archivos de Linux</a></li><li><a href="#navegando-sistema-archivos-de-linux">4.2. Navegando a través del Sistema de Archivos de Linux</a></li><li><a href="#manejando-archivos-y-carpetas">4.3. Manejando Archivos y Directorios</a></li><li><a href="#localizando-archivos-y-carpetas">4.4 Localizando archivos y carpetas usando el comando <code>find</code></a></li><li><a href="#comandos-basicos-para-ver-archivos">4.5. Comandos Básicos para ver Archivos</a></li></ul><p><a href="#parte-5-esencial-sobre-edicion-texto-linux">Parte 5: Lo Esencial sobre Edición de Texto en Linux</a></p><ul><li><a href="#dominando-vim-guia-completa">5.1. Dominando Vim: La Guía Completa</a></li><li><a href="#dominando-nano">5.2. Dominando Nano</a></li></ul><p><a href="#parte-6-programacion-en-bash">Parte 6: La Programación en Bash</a></p><ul><li><a href="#definicion-de-los-scripts-bash">6.1. Definición de los scripts de Bash</a></li><li><a href="#ventajas-scripts-bash">6.2. Ventajas de los scripts de Bash</a></li><li><a href="#vista-general-shell-bash-y-cli">6.3. Vista General del Shell Bash y de la Interfaz de Línea de Comandos</a></li><li><a href="#como-crear-y-ejecutar-scripts-bash">6.4. Cómo crear y ejecutar scripts de Bash</a></li><li><a href="#basico-programacion-bash">6.5. Lo Básico de la Programación en Bash</a></li></ul><p><a href="#parte-7-manejo-paquetes-software-linux">Parte 7: Manejando Paquetes de Software en Linux</a></p><ul><li><a href="#paquetes-y-gestion-paquetes">7.1. Paquetes y Gestión de Paquetes</a></li><li><a href="#instalando-paquete-a-traves-cli">7.2. Instalando un Paquete a través de la Línea de Comando</a></li><li><a href="#instalando-paquete-a-traves-gui-synaptic">7.3. Instalando un Paquete a través de un Método Gráfico Avanzado – Synaptic</a></li><li><a href="#instalando-paquetes-descargados">7.4. Instalando Paquetes Descargados desde un sitio web</a></li></ul><p><a href="#parte-8-temas-linux-avanzados">Parte 8: Temas de Linux Avanazados</a></p><ul><li><a href="#gestion-del-usuario">8.1. Gestión del Usuario</a></li><li><a href="#conectandose-sevidores-remotos-a-traves-ssh">8.2 Conectándose a Servidores Remotos a través de SSH</a></li><li><a href="#analisis-sintactico-y-analisis-log-avanzado">8.3. Análisis Sintáctico y Análisis de Archivos Log Avanzados</a></li><li><a href="#gestionando-procesos-de-linux">8.4. Manejando los Procesos de Linux a través de la Línea de Comandos</a></li><li><a href="#flujos-entrada-y-salida-estandar-en-linux">8.5. Flujos de Entrada y Salida Estándar en Linux</a></li><li><a href="#automatizacion-linux-automatizar-tareas-cron-jobs">8.6 Automatización en Linux – Automatizar Tareas con Tareas de Cron</a></li><li><a href="#conceptos-basicos-de-redes-de-linux">8.7. Conceptos Básicos de Redes de Linux</a></li><li><a href="#solucionando-problemas-linux-herramientas-y-tecnicas">8.8. Solución de problemas de Linux: Herramientas y Técnicas</a></li><li><a href="#estrategia-general-para-solucionar-problemas-servidores">8.9. Estrategia de Solución de Problemas General para los Servidores</a></li></ul><p><a href="#conclusion">Conclusión</a></p><!--kg-card-begin: html--><h2 id="parte-1-introduccion-linux">Parte 1: Introducción a Linux</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comenzando-linux">1.1. Comenzando con Linux</h3><!--kg-card-end: html--><h4 id="-qu-es-linux">¿Qué es Linux?</h4><p>Linux es un Sistema Operativo de código abierto que está basado en el Sistema Operativo Unix. Fue creado por Linus Torvalds in 1991.</p><p>El Código Abierto significa que el código fuente del Sistema Operativo está disponible al público. Este le permite a cualquiera modificar el código origina, personalizarlo, y distribuir el Sistema Operativo a usuarios potenciales.</p><h4 id="-por-qu-deber-as-aprender-sobre-linux">¿Por qué deberías aprender sobre Linux?</h4><p>En el escenario de los centros de datos de hoy, Linux y Microsoft Windows se destacan como los contendientes, con Linux teniendo la mayor parte.</p><p>Aquí hay varias razones convincentes para aprender Linux:</p><ul><li>Dada la prevalencia del alojamiento de Linux, hay una alta chance que tu aplicación será alojado en Linux. Así que aprender Linux como un desarrollador se convierte cada vez más valorado.</li><li>Con la computación en la nube se convierte en la norma, las chances son altas que tus instancias de la nube se basará en Linux.</li><li>Los servidores de Linux como la fundación para muchos Sistemas Operativos para el Internet de las Cosas (IoT) y aplicaciones móviles.</li><li>En IT, hay muchas oportunidades para aquellos hábiles en Linux.</li></ul><h4 id="-qu-significa-que-linux-es-un-sistema-operativo-de-c-digo-abierto">¿Qué significa que Linux es un Sistema Operativo de código abierto?</h4><p>Primero, ¿qué es código abierto? Software de código abierto cuyo código fuente es accesible gratuitamente, permitiendo a cualquier utilizar, modificar y distribuirlo.</p><p>Cuando sea que el código fuente fuese creado, se considera automáticamente protegido por derechos de autor, y su distribución se rige por el titular de los derechos de autor a través de licencias de software.</p><p>En contraste al código abierto, el software propietario o de código cerrado restringe el acceso a su código fuente. Solamente los creadores pueden verlos, modificarlos o distribuirlos.</p><p>Linux es ante todo de código abierto, lo que significa que su código fuente está disponible de forma gratuita. Cualquiera puede verlo, modificarlo, y distribuirlo. Los Desarrolladores desde cualquier lugar en el mundo pueden contribuir a sus mejoras. Esto sienta la fundación de la colaboración lo cual es un aspecto importante del software de código abierto.</p><p>Esto enfoque colaborativo ha llevado a la amplia adopción de Linux entre los servidores, computadoras de escritorio, sistemas embebidos, y dispositivos móviles.</p><p>El aspecto más interesante de Linux siendo de código abierto es que cualquier puede adaptar el sistema operativo a sus necesidades específicas sin ser restringido por las limitaciones de propiedad.</p><p>El SO (Sistema Operativo) Chrome utilizado por los Chromebooks está basado en Linux. Android, que impulsa a muchos teléfonos inteligentes, también está basado en Linux.</p><p><strong>¿Qué es un Kernel de Linux?</strong></p><p>El kernel es el componente central de un Sistema Operativo que gestiona la computadora y sus operaciones hardware. Maneja operaciones de memoria y el tiempo de CPU.</p><p>El kernel actúa como un puente entre aplicaciones y el proceso de datos a nivel de hardware usando la comunicación entre procesos y llamadas de sistema.</p><p>El kernel se carga en memoria primero cuando un Sistema Operativo comienza y permanece allí hasta que el sistema se apaga. Es responsable de tareas como la gestión de disco, gestión de tareas, y gestión de memoria.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719844849011/f4bb226e-f319-4cb5-bfc9-c1a80401123e.png" class="kg-image" alt="Linux Kernel Layout showing interaction of kernal with applications and OS" width="563" height="393" loading="lazy"></figure><p>Si estás interesado en saber cómo se ve el kernel de Linux, <a href="https://github.com/torvalds/linux">aquí</a> está el enlace de Github.</p><h4 id="-que-es-una-distribuci-n-de-linux">¿Que es una distribución de Linux?</h4><p>A este punto, sabes que puedes re-usar el código kernel de Linux, modificarlo, y crear un nuevo kernel. Puedes aún combinar diferentes utilidades y software para crear un Sistema Operativo completamente nuevo.</p><p>Una distribución de Linux o distro es una versión del Sistema Operativo Linux que incluye el kernel de Linux, utilidades de sistema, y otros software. Siendo de código abierto, una distribución de Linux es un esfuerzo colaborativo que involucra múltiples comunidades de desarrollo de código abierto independientes.<strong>¿Qué significa que una distribución sea derivado?</strong> Cuando dices que una distribución es "derivado" de otro, el nuevo distro está construido sobre la base o fundación del distro original. Esta derivación puede incluir el usar el sistema de gestión de paquetes (más sobre esto después), versión del kernel, y a veces las mismas herramientas de configuración.</p><p>Hoy, hay miles distribuciones de Linux para elegir, ofreciendo diferentes objetivos y criterios para seleccionar y soportar el software provisto por su distribución.</p><p>Las distribuciones varían uno del otro, pero generalmente tienen características en común.</p><ul><li>Una distribución consiste de un kernel de Linux.</li><li>Soporta programas de espacio de usuario.</li><li>Una distribución podría ser pequeño y de un solo propósito o incluir miles de programas de código abierto.</li><li>Algunos medios para instalar y actualizar la distribución y sus componentes debería ser provistos.</li></ul><p>Si ves la <a href="https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg">Línea de Tiempo de las Distribuciones de Linux</a>, verás dos mayores distros: Slackware y Debian. Varias distribuciones son derivados de ellos. Por ejemplo, Ubuntu y Kali son derivados de Debian.</p><p><strong>¿Cuáles son las ventajas de la derivación?</strong> Hay varias ventajas de la derivación. La Distribuciones derivadas pueden aprovechar la estabilidad, seguridad, y grandes repositorios de software de la distribución padre.</p><p>Cuando se construye sobre una fundación existente, los desarrolladores pueden conducir su enfoque y esfuerzo enteramente en las características especializadas de la nueva distribución. Los usuarios de distribuciones derivadas se pueden beneficiar de la documentación, el soporte de comunidad, y recursos ya disponibles para la distribución padre.</p><p>Algunas distribuciones de Linux populares son:</p><ol><li><strong>Ubuntu</strong>: Uno de las distribuciones de Linux más usado y más popular. Es amigable y recomendado para los principiantes. <a href="https://ubuntu.com/">Aprender más sobre Ubuntu aquí</a>.</li><li><strong>Linux Mint</strong>: Basado en Ubuntu, Linux Mint provee una experiencia amigable con un enfoque en soporte de multimedia. <a href="https://linuxmint.com/">Aprender más sobre Linux Mint aquí</a>.</li><li><strong>Arch Linux</strong>: Popular entre usuarios experimentados, Arch es una distribución ligera y flexible dirigido a usuarios que prefieren un enfoque DIY. <a href="https://www.archlinux.org/">Aprender más sobre Arch Linux aquí</a>.</li><li><strong>Manjaro</strong>: Basado en Arch Linux, Manjaro provee una experiencia amigable con software pre-instalado y herramientas sencillas de gestión del sistema. <a href="https://manjaro.org/">Aprender más sobre Manjaro aquí</a>.</li><li><strong>Kali Linux</strong>: Kali Linux provee un conjunto comprensivo de herramientas de seguridad y está mayormente enfocado en ciberseguridad y hacking. <a href="https://www.kali.org/">Aprender más sobre Kali Linux aquí</a>.</li></ol><h4 id="c-mo-instalar-y-acceder-a-linux">Cómo instalar y acceder a Linux</h4><p>La mejor manera de aprender es aplicar los conceptos a medidas que avanzas. En esta sección, aprenderemos cómo instalar Linux en tu máquina así puedes seguirme. También aprenderás cómo acceder a Linux en una máquina con Windows.</p><p>Te recomiendo que sigas cualquiera de los métodos mencionados en esta sección para tener acceso a Linux así puedes seguirme.</p><h5 id="instalar-linux-como-el-so-primario">Instalar Linux como el SO primario</h5><p>Instalar Linux como el SO primario es la forma más eficiente de usar Linux, ya que puedes usar todo el poder de tu máquina.</p><p>En esta sección, aprenderás cómo instalar Ubuntu, el cual es uno de las distribuciones de Linux más popular. Dejé fuera de lista otras distribuciones por ahora, ya que quiero mantener las cosas sencillas. Siempre puedes explorar otras distribuciones una vez que te sientas cómodo con Ubuntu.</p><p><strong>Paso 1 – Descargar el iso de Ubuntu:</strong> Ve al <a href="https://ubuntu.com/download/desktop">sitio web</a> oficial y descarga el archivo iso. Asegúrate en seleccionar un lanzamiento estable que está caracterizado como "LTS". LTS significa "Soporte de Largo Término" (Long Term Support en inglés) lo que significa que puedes obtener seguridad gratuita y actualizaciones de mantenimiento por un tiempo prolongado (usualmente 5 años).</p><p><strong>Paso 2 – Crea un pendrive bootable:</strong> Hay un número de softwares que puede crear un pendrive booteable. Recomiendo usar Rufus, ya que es bastante fácil de usar. Puedes descargarlo <a href="https://rufus.ie/">aquí</a>.</p><p><strong>Paso 3 – Iniciar desde el pendrive:</strong> Una vez que tu pendrive bootable está listo, insértalo y inicia desde el pendrive. El menú del boot depende de tu laptop. Puedes buscar en google el menú de boot para tu modelo de laptop.</p><p><strong>Paso 4 – Sigue los pasos.</strong> Una vez, que el proceso de boot comience, selecciona <code>try or install ubuntu</code>.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719304227675/5b706f94-7368-47ca-a4d6-d55a0d92eff9.png" class="kg-image" alt="Screen prompt to either try or install Ubuntu" width="611" height="329" loading="lazy"></figure><p>El proceso tomará algo de tiempo. Una vez que el GUI aparece, puedes seleccionar el idioma, y el teclado, y continuar. Ingresa al inicio de sesión con tu nombre. Recuerda las credenciales ya que los necesitarás para inciar sesión en tu sistema y acceder a privilegios totales. Espera que la instalación se complete.</p><p><strong>Paso 5 – Reinicia:</strong> Haz clic en reiniciar ahora y retira el pen drive.</p><p><strong>Paso 6 – Inicia sesión:</strong> Inicia sesión con las credenciales que ingresaste anterioremente.</p><p>¡Y ahí está! Ahora puedes instalar aplicaciones y personalizar tu escritorio.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719304547967/d150c6eb-d04e-47e0-8473-d1a837df45c4.png" class="kg-image" alt="Ubuntu 22.04.4 LTS Desktop screen" width="1920" height="1080" loading="lazy"></figure><p>Para una instalación avanzada, puedes explorar los siguientes temas:</p><ul><li>Particionamiento de Disco.</li><li>Configurar la memoria de intercambio para permitir la hibernación.</li></ul><p><strong>Accediendo a la terminal</strong></p><p>Una parte importante de este manual es aprender sobre la terminal donde ejecutarás todos los comandos y ver toda la magia. Puedes buscar en la terminal presionando la tecla "window" y escribiendo "terminal". Puedes fijar la Terminal en el <em>dock</em> donde otras aplicaciones están localizadas para un fácil acceso.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719305113272/4dd30c5e-da73-4cd4-86bb-7dcd8cd2084c.png" class="kg-image" alt="Search results for &quot;terminal&quot;" width="437" height="255" loading="lazy"></figure><blockquote>💡 The shortcut for opening the terminal is <code>ctrl+alt+t</code></blockquote><p>También puedes abrir la terminal desde una carpeta. Haz clic derecho donde estás y haz clic en "Abrir en Terminal". Esto abrirá la terminal en la misma ruta.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719305289021/284a4a53-2d1a-4eaa-925a-1002a32c1dce.png" class="kg-image" alt="Opening the terminal with right click menu" width="640" height="414" loading="lazy"></figure><h5 id="c-mo-usar-linux-en-una-m-quina-windows">Cómo usar Linux en una máquina Windows</h5><p>A veces prodrías necesitar ejecutar tanto Linux como Windows lado a lado. Afortunadamente, hay varias maneras que puedes aprovechar de ambos mundos sin tener distintas computadoras para cada sistema operativo.</p><p>En esta sección, explorarás una pocas formas de usar Linux en una máquina de Linux. Algunos de ellos basados al navegador o basados en la nube y no necesita ninguna instalación de SO antes de usarlos.</p><p><strong>Opción 1: "Dual-boot" Linux + Windows</strong>: Con dual boot, puedes instalar Linux juntamente con Windows en tu computadora, permitiéndote elegir qué Sistema Operativo usar al inicio.</p><p>Esto requierer particionar tu disco duro e instalar Linux en una partición separada. Con este enfoque, solamente puedes usar un sistema Operativo a la vez.</p><p><strong>Opción 2: USar el Subsitema de Windows &nbsp;para Linux &nbsp;(WSL)</strong>: El Subsistema para Linux provee una capa de comtabilidad que te permite ejecutar ejecutables binarios de Linux de forma nativa en WIndows.</p><p>Usando WSL tiene algunas ventajas. La configuración para WSL es sencilla y rápida. Es liviana comparado con los VMs donde tiene que aisgnar recursos desde la máquina anfitriona. No necesitas instalar ningún ISO o imagen de disco virtual para las máquinas Linux los cuales tienden a ser archivos pesados. Puedes usar Windows y Linux lado a lado.</p><p><strong>Cómo instalar WSL2</strong></p><p>Primero, activa el Subsitema de Windows para la opción Linux en las configuraciones.</p><p>Ve al inicio. Busca "Turn Windows features on or off".</p><p>Verifica la opción "Windows Subsystem for Linux" si ya no está.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306102095/84f23bae-faa5-4ece-a9b6-e40f8789a061.png" class="kg-image" alt="Checking the option &quot;Windows Subsystem for Linux&quot; in Windows features" width="891" height="550" loading="lazy"></figure><p>Luego, abre tu línea de comandos y provee los comandos de instalación.</p><p>Abre la terminal como un administrador:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720451480640/6052c9b4-cf07-47e0-ae89-18c3a2d3e385.png" class="kg-image" alt="Running command prompt as an admin by right clicking the app and choosing &quot;run as admin£" width="1032" height="846" loading="lazy"></figure><p>Ejecuta el comando de abajo:</p><pre><code class="language-markdown">wsl --install
</code></pre><p>Esta es la salida:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306131053/b7272031-ddb7-4e04-8d7b-bafc0911da04.png" class="kg-image" alt="Downloading progress of Ubuntu" width="1099" height="637" loading="lazy"></figure><p>Nota: Por defecto, Ubuntu será instalado.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306144861/a01f95df-1d95-4b79-bff9-08759be0d3dc.png" class="kg-image" alt="Ubuntu installed by default using WSL" width="1092" height="626" loading="lazy"></figure><ul><li>Una vez que la instalación está completa, necesitarás reiniciar tu máquina WIndows. Así que, reinicia tu máquina con Windows.</li></ul><p>Después de reiniciar, verías una ventana así:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306157704/15620fbe-59d1-40da-9cd6-119a1fab0802.png" class="kg-image" alt="Window that shows after a restart" width="1111" height="647" loading="lazy"></figure><p>Una vez que la instalación de Ubuntu está completa, se te pedirá que ingreses tu nombre de usuario y la constraseña.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306167380/5e3058cd-b7a1-45b1-a16d-c23b5a451504.png" class="kg-image" alt="User prompted to enter a username and password" width="908" height="611" loading="lazy"></figure><p>Y, ¡y eso es todo! Estás listo ya para usar Ubuntu.</p><p>Lanza Ubuntu buscando desde el menú de inicio.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306185110/77c17856-08ac-4ec7-9380-5b06f93be095.png" class="kg-image" alt="Launching Ubuntu from the start menu" width="966" height="846" loading="lazy"></figure><p>Y aquí tenemos tu instancia de Ubuntu lanzada.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306196320/13be3a71-5b40-440c-a6bf-d742e5b5934b.png" class="kg-image" alt="Successful installation of Ubuntu using WSL" width="1103" height="639" loading="lazy"></figure><p><strong>Opción 3: Usa a Máquina Virtual (VM)</strong></p><p>Una máquina virtual (VM) es una emulación de software de un sistema de computación de Física. Te permite ejeuctar múltiples Sistemas Operativos y aplicaciones en una sola máquina física simultáneamente.</p><p>Puedes usar la Virtualización de Software tales como VirtualBox de Oracle o VMware para crear una máquina virtual que ejecuta Linux dentro de tu entorno de Windows. Esto te permite ejecutar Linux como un SIstema Operativo invitado junto a Windows.</p><p>El software VM provee opciones para asignar y gestionar los recursos hardware para cada VM, incluyendo núcles de CPU, memoria, espacio de disco, y ancho de banda de red. Puedes ajustar estas asignaciones basado en los requerimientos de los Sistemas Operativos invitados y las aplicaciones.</p><p>Aquí hay algunas de las opciones comúnes disponibles para la Virtualización:</p><ul><li><a href="https://www.virtualbox.org/">Oracle virtual box</a></li><li><a href="https://multipass.run/">Multipass</a></li><li><a href="https://www.vmware.com/content/vmware/vmware-published-sites/us/products/workstation-player.html.html">VMware workstation player</a></li></ul><p><strong>Opción 4: Usa una Solución basado en el Navegador</strong></p><p>Las soluciones basados en el Navegador son particularmente útiles para pruebas rápidas, aprender, o acceder a entornos de Linux desde dispositivos que no tienen Linux instalado.</p><p>Puedes usar los editores de código en líne o terminales basadas en web para acceder a Linux. Fíjate que usualmente no tienes privilegios de administrador en estos casos.</p><h4 id="editores-de-c-digo-en-l-nea"><strong>Editores de Código en línea</strong></h4><p>Los Editores de Código en línea con terminales de Linux incorporadas. Mientras que su propósito primario es codificar, también puedes utilizar la terminal de Linux para ejecutar comandos y realizar tareas.</p><p><a href="https://replit.com/">Replit</a> es un ejemplo de un editor de código en línea, donde puedes escribir tu código y acceder a la shell de Linux al mismo tiempo.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306257260/d85d5541-b78f-4c8b-99a8-dbd8c097f661.gif" class="kg-image" alt="Running scripts and a bash shell in Replit" width="1520" height="721" loading="lazy"></figure><h4 id="terminales-de-linux-basados-en-web"><strong>Terminales de Linux basados en Web</strong></h4><p>Las terminales de Linux en línea te permiten acceder a una interfaz de línea de comandos desde tu navegador. Estas terminalesproveen una interfaz basada en web a un shell de Linux, permitiéndote ejecutar comandos y trabajar con utilidades de Linux.</p><p>Un ejemploes <a href="https://jslinux.org/">JSLinux</a>. La captura de abajo muestra un entorno de Linux listo para ser usado:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306276915/ddaabfc3-9a20-43b2-bedc-0af6875d2008.png" class="kg-image" alt="Using JSLinux to access Linux terminal" width="826" height="765" loading="lazy"></figure><p><strong>Opción 5: Usa una Solución basada en la Nube</strong></p><p>En vez de ejecutar Linux directamente en tu máquina de Windows, puedes considerar usar entornos de Linux basados en la nube o Servidores Privados Virtuales (VPS), para acceder y trabajar con Linux remotamente.</p><p>Servicios como Amazon EC2, Microsoft Azure, o DigitalOcean proveen instancias de Linux a las que te puedes conectar desde tu computadora de Windows. Fíjate que algunos de estos servicios ofrecen planes gratuitos, pero no son usualmente gratis a la larga.</p><!--kg-card-begin: html--><h2 id="parte-2-introduccion-bash">Parte 2: Introducción al Shell de Bash y Comandos de Sistema</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comenzando-bash">2.1. Comenzando con el shell de Bash</h3><!--kg-card-end: html--><h4 id="introducci-n-al-shell-de-bash">Introducción al shell de bash</h4><p>La línea de comandos de Linux es provisto por un programa llamado el shell. A través de los años, el programa shell ha evolucinado para atender varias opciones.</p><p>Distintos usuarios pueden ser configurados para usar distintos shells. Pero, la mayoría de los usuarios prefieren quedarse con su shell predeterminado actual. El shell predeterminado para muchos distros de Linux es el Bourne-Again Shell de GNU (<code>bash</code>). Bash es sucedido por el shell Bourne (<code>sh</code>).</p><p>Para saber tu shell actual, abre tu terminal e ingresa el siguiente comando:</p><pre><code class="language-bash">echo $SHELL
</code></pre><p>Desglose del comando:</p><ul><li>El comando <code>echo</code> se usa para imprimir en la terminal.</li><li>El <code>$SHELL</code> es una variable especial que contiene el nombre del shell actual.</li></ul><p>En mi configuración, la salida es <code>/bin/bash</code>. Esto significa que estoy usando el shell bash.</p><pre><code class="language-bash"># output
echo $SHELL
/bin/bash
</code></pre><p>Bash es muy poderoso ya que puede simplificar ciertas operaciones que son difíciles de lograr eficientemente con un GUI (o Interfaz de Usuario Gráfico). Recuerda que la mayoría de los servidores no tienen un GUI, y es mejor aprender a usar los poderosos de una interfza de línea de comandos (CLI).</p><p><strong>Terminal vs Shell</strong></p><p>Los términos "terminal" y "shell" son frecuentemente usado de forma intercambiable, pero se refieren a distitnas partes de la interfaz de línea de comandos.</p><p>La terminal es la interfaz que usas para interactuar con el shell. El shell es el intérprete de comandos que procesa y ejecuta tus comandos. Aprenderás más sobre los shells en la Parte 6 del manual.</p><h4 id="-qu-es-un-prompt">¿Qué es un prompt?</h4><p>Cuando un shell se usa interactivamente, muestra un <code>$</code> cuando espera un comando del usuario. Este es el prompt del shell.</p><pre><code>[username@host ~]$
</code></pre><p>Si el shell se está ejecutando como <code>root</code> (aprenderás más sobre el usuario root luego), el prompt se cambia a <code>#</code>.</p><pre><code>[root@host ~]#
</code></pre><!--kg-card-begin: html--><h3 id="estructura-comando">2.2. Estructura del Comando</h3><!--kg-card-end: html--><p>Un comando es un programa que ejecuta una operación específica. Una vez que tienes acceso a la shell, puedes ingresar cualquier comando después del signo <code>$</code> y ves la salida en la terminal.</p><p>Generalmente, los comandos de Linux sigue esta sintaxis:</p><pre><code class="language-bash">command [options] [arguments]
</code></pre><p>Aquí está el desglose de la sintaxis de arriba:</p><ul><li><code>command</code>: Este es el nombre del comando que quieres ejecutar. <code>ls</code> (list - listar), <code>cp</code> (copy - copiar), y <code>rm</code> (remove - borrar) son comandos comúnes de Linux.</li><li><code>[options]</code>: Opciones, o flags, son precedidos frecuentemente por un guión (-) o doble guiones (--), modifican el comportamiento del comando. Pueden cambiar cómo opera el comando. Por ejemplo, <code>ls -a</code> usa la opción <code>-a</code> para mostrar los archivos ocultos en la carpeta actual.</li><li><code>[arguments]</code>: Los argumentos son las entradas para los comandos que uno requiere. Estos pueden ser nombres de archivos, nombres de usuario, u otros datos sobre los cuales el comando actuará. Por ejemplo, en el comando <code>cat access.log</code>, <code>cat</code> es el comando y <code>access.log</code> es la entrada. Como resultado, el comando <code>cat</code> muestra los contenidos del archivo <code>access.log</code>.</li></ul><p>Las opciones y argumentos no son requeridos por todos los comandos. Algunos comandos pueden ser ejecutados sin ninguna opción o argumento, mientras que otros podrían requerir uno o ambos para que funcionen correctamente. Siempre puedes referirte al manual del comando para ver las opciones y los argumentos que soporta.</p><p>💡<strong>Consejo:</strong> Puedes ver el manual de un comando usando el comando <code>man</code>.</p><p>Puedes acceder a la página manual para <code>ls</code> con <code>man ls</code>, y te mostrará algo así:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719312523336/5b1232a6-8c0b-4a97-86f0-9f15f2e14ed7.png" class="kg-image" alt="5b1232a6-8c0b-4a97-86f0-9f15f2e14ed7" width="1890" height="969" loading="lazy"></figure><p>Las páginas manuales son una forma genial y rápida para acceder a la documentación. Recomiendo leer las páginas de man para los comandos que mas usas.</p><!--kg-card-begin: html--><h3 id="comandos-bash-y-atajos">2.3. Comandos de Bash y Atajos de Teclado</h3><!--kg-card-end: html--><p>Cuando estás en la terminal, puedes acelerar tus tareas usando atajos.</p><p>Aquí hay algunos de los atajos más comunes de la terminal:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Operación</th>
<th>Atajo</th>
</tr>
</thead>
<tbody>
<tr>
<td>Busca el comando previo</td>
<td>Flecha arriba</td>
</tr>
<tr>
<td>Salta al principio de la palabra previa</td>
<td>Ctrl+FlechaAbajo</td>
</tr>
<tr>
<td>Limpia los caracteres del cursor al final de la línea de comandos</td>
<td>Ctrl+K</td>
</tr>
<tr>
<td>Completa los comandos, nombres de archivo, y opciones</td>
<td>Presionando Tab</td>
</tr>
<tr>
<td>Salta al principio de la línea de comandos</td>
<td>Ctrl+A</td>
</tr>
<tr>
<td>Muestra la lista de comandos previos</td>
<td>history</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comando-whomai">2.4. Identificándote: El comando whoami</h3><!--kg-card-end: html--><p>Puedes obtener el nombre de usuario con el que iniciaste sesión con el comando <code>whoami</code>. Este comando es útil cuando cambias entre distintos usuarios y quieres confirmar el usuario actual.</p><p>Justo después del signo <code>$</code>, escribe <code>whoami</code> y presiona enter.</p><pre><code class="language-bash">whoami
</code></pre><p>Esta es la salida que obtuve.</p><pre><code class="language-bash">zaira@zaira-ThinkPad:~$ whoami
zaira
</code></pre><!--kg-card-begin: html--><h2 id="parte-3-entendiendo-sistema-linux">Parte 3: Entendiendo tu Sistema de Linux</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="descubriendo-tu-so-y-especificaciones">3.1. Descubriendo tu SO y Especificaciones</h3><!--kg-card-end: html--><h4 id="imprimir-informaci-n-del-sistema-usando-el-comando-uname">Imprimir información del sistema usando el comando <code>uname</code></h4><p>Puedes obtener información del sistema de forma detallada del comando <code>uname</code>.</p><p>Cuando provees la opción <code>-a</code>, imprime toda la información del sistema.</p><pre><code class="language-bash">uname -a
# salida
Linux zaira 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb  9 13:32:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
</code></pre><p>En la salida de arriba,</p><ul><li><code>Linux</code>: Indica el sistema operativo.</li><li><code>zaira</code>: Representa el nombre del host de la máquina.</li><li><code>6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2</code>: Provee información sobre la versión del kernel, fecha de la construcción, y algunos detalles adicionales.</li><li><code>x86_64 x86_64 x86_64</code>: Indica la arquitectura del sistema.</li><li><code>GNU/Linux</code>: Representa el tipo de sistema operativo.</li></ul><h4 id="encontrar-detalles-de-la-arquitectura-de-la-cpu-usando-el-comando-lscpu">Encontrar detalles de la arquitectura de la CPU usando el comando <code>lscpu</code></h4><p>El comando <code>lscpu</code> en Linux se usa para mostrar información sobre la arquitectura de la CPU. Cuando ejecutas <code>lscpu</code> en la terminal, provee detalles tales como:</p><ul><li>La arquitectura de la CPU (por ejemplo, x86_64)</li><li>op-mode(s) de la CPU (por ejemplo, 32-bit, 64-bit)</li><li>Orden de Byte (por ejemplo, Little Endian)</li><li>CPU(s) (número de CPUs), y así sucesivamente</li></ul><p>Intentémoslo:</p><pre><code class="language-bash">lscpu
# salida
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
Vendor ID:               AuthenticAMD
  Model name:            AMD Ryzen 5 5500U with Radeon Graphics
    Thread(s) per core:  2
    Core(s) per socket:  6
    Socket(s):           1
    Stepping:            1
    CPU max MHz:         4056.0000
    CPU min MHz:         400.0000
</code></pre><p>Eso fue mucha información, ¡pero útil también! Recuerda que siempre puedes ir viendo información relevante usando argumentos específicos. Ve el manual del comando con <code>man lscpu</code>.</p><!--kg-card-begin: html--><h2 id="parte-4-manejando-archivos-desde-el-cli">Parte 4: Manejando archivos desde la Línea de Comandos</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="la-jerarquia-del-sistema-archivos-linux">4.1. La Jerarquía del sistema de archivos de Linux</h3><!--kg-card-end: html--><p>Todos los archivos en Linux son almacenados en un sistema de archivos. Sigue una estructura tipo árbol invertido porque la raíz está en la parte superior.</p><p>El &nbsp;<code>/</code> es la carpeta raíz y el punto de comienzo del sistema de archivos. La carpeta raíz contiene todas las otras carpetas y archivos en el sistema. El caracter <code>/</code> también sirve como una carpeta separadora entre los nombres de rutas. Por ejemplo, <code>/home/alice</code> forma una ruta completa.</p><p>La imagen de abajo muestra la jerarquía completa del sistema de archivos. Cada carpeta sirve un propósito específico.</p><p>Fíjate que esta no es una lista exhaustiva y distintas distribuciones podría tener distintas configuraciones.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719322457140/02fdbf2c-f4fa-438b-af2f-c23f59f9ddf4.png" class="kg-image" alt="Linux file system hierarchy" width="1455" height="474" loading="lazy"></figure><p>Aquí hay una tabla que muestra el propósito de cada carpeta:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Ubicación</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr>
<td>/bin</td>
<td>Binarios de comandos esenciales</td>
</tr>
<tr>
<td>/boot</td>
<td>Archivos estáticos del cargador de arranque (boot loader), necesario para comenzar el proceso de incio.</td>
</tr>
<tr>
<td>/etc</td>
<td>Configuración de sistema específica del host</td>
</tr>
<tr>
<td>/home</td>
<td>Carpetas personales del usuario</td>
</tr>
<tr>
<td>/root</td>
<td>Carpeta personal para el usuario root administrativo</td>
</tr>
<tr>
<td>/lib</td>
<td>Librerías compartidas y módulos del kernel esenciales</td>
</tr>
<tr>
<td>/mnt</td>
<td>Punto de montaje para montar un sistema de archivos de forma temporal</td>
</tr>
<tr>
<td>/opt</td>
<td>Paquetes de software de aplicación complementarios</td>
</tr>
<tr>
<td>/usr</td>
<td>Software y librerías compartidas instalados</td>
</tr>
<tr>
<td>/var</td>
<td>Datos de variables que es también persistente entre los arranques</td>
</tr>
<tr>
<td>/tmp</td>
<td>Archivos temporarios que son accessibles a todos los usuarios</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>💡 <strong>Consejo:</strong> Puedes aprender más sobre el sistema de archivos usando el comando <code>man hier</code>.</p><p>Puedes ver tu sistema de archivos usando el comando <code>tree -d -L 1</code>. Puedes modificar el argumento <code>-L</code> para cambiar la profundidad del árbol.</p><pre><code class="language-bash">tree -d -L 1
# salida
.
├── bin -&gt; usr/bin
├── boot
├── cdrom
├── data
├── dev
├── etc
├── home
├── lib -&gt; usr/lib
├── lib32 -&gt; usr/lib32
├── lib64 -&gt; usr/lib64
├── libx32 -&gt; usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -&gt; usr/sbin
├── snap
├── srv
├── sys
├── tmp
├── usr
└── var

25 carpetas
</code></pre><p>Esta lista no es exhaustiva y distintas distribuciones y sistemas podrían ser configurados de forma distinta.</p><!--kg-card-begin: html--><h3 id="navegando-sistema-archivos-de-linux">4.2. Navegando el sistema de archivos de Linux</h3><!--kg-card-end: html--><h4 id="ruta-absoluta-vs-ruta-relativa">Ruta absoluta vs ruta relativa</h4><p>La ruta absoluta es la ruta completa de la carpeta raíz al archivo o a la carpeta. Siempre comienza con un <code>/</code>. Por ejemplo, <code>/home/john/documents</code>.</p><p>La ruta relativa, por otro lado, es la ruta desde la carpeta actual al archivo de destino o a la carpeta. No comienza con un <code>/</code>. Por ejemplo, <code>documents/work/project</code>.</p><h4 id="localizando-tu-carpeta-actual-usando-el-comando-pwd">Localizando tu carpeta actual usando el comando <code>pwd</code></h4><p>Es fácil perder tu camino en el sistema de archivos de Linux, especialmente si eres nuevo en la línea de comandos. Puedes localizar tu carpeta actual usando el comando <code>pwd</code>.</p><p>Aquí hay un ejemplo:</p><pre><code class="language-bash">pwd
# output
/home/zaira/scripts/python/free-mem.py
</code></pre><h4 id="cambiando-carpetas-usando-el-comando-cd">Cambiando carpetas usando el comando <code>cd</code></h4><p>El comando para cambiar carpetas es <code>cd</code> y significa "cambiar carpeta - change directory en inglés". Puedes usar el comando <code>cd</code> para navegar hacia otra carpeta diferente.</p><p>Puedes usar una ruta relativa o una ruta absoluta.</p><p>Por ejemplo, si quieres navegar la estructura de archivos de abajo (siguiendo las líneas rojas):</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719389950079/640cce46-6c52-4f38-9787-581747fb9798.png" class="kg-image" alt="Example file structure" width="327" height="253" loading="lazy"></figure><p>y estás en "home", el comando sería así:</p><pre><code class="language-bash">cd home/bob/documents/work/project
</code></pre><p>Otros atajos de <code>cd</code> usado comúnmente son:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Comando</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cd ..</code></td>
<td>Regresar una carpeta</td>
</tr>
<tr>
<td><code>cd ../..</code></td>
<td>Regresar dos carpetas</td>
</tr>
<tr>
<td><code>cd</code> o <code>cd ~</code></td>
<td>Regresar a la carpeta personal</td>
</tr>
<tr>
<td><code>cd -</code></td>
<td>Regresar a la ruta previa</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="manejando-archivos-y-carpetas">4.3. Manejando archivos y carpetas</h3><!--kg-card-end: html--><p>Cuando se trabaja con archivos y carpetas, podrías querer copiar, mover, quitar, y crear archivos y carpetas nuevas. Aquí hay algunos comandos que te pueden ayudar con eso.</p><p>💡<strong>Consejo:</strong> Puedes diferenciar entre un archivo y una carpeta mirando la primera letra en la salida de <code>ls -l</code>. Un <code>'-'</code> representa un archivo y un <code>'d'</code> representa una carpeta.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719390306244/4f1688cd-ded5-43fe-b13a-9ca44ac7c4ad.png" class="kg-image" alt="&quot;d&quot; represents a folder" width="766" height="226" loading="lazy"></figure><h4 id="creando-nuevas-carpetas-usando-el-comando-mkdir">Creando nuevas carpetas usando el comando <code>mkdir</code></h4><p>Puedes crear una carpeta vacía usando el comando <code>mkdir</code>.</p><pre><code class="language-bash"># creates an empty directory named "foo" in the current folder
mkdir foo
</code></pre><p>También puedes crear carpetas recursivamente usando la opción <code>-p</code>.</p><pre><code class="language-bash">mkdir -p tools/index/helper-scripts
# output of tree
.
└── tools
    └── index
        └── helper-scripts

3 directories, 0 files
</code></pre><h4 id="creando-nuevos-archivos-usando-el-comando-touch">Creando nuevos archivos usando el comando <code>touch</code></h4><p>El comando <code>touch</code> crea un archivo vacío. Puedes usarlo así:</p><pre><code class="language-bash"># creates empty file "file.txt" in the current folder
touch file.txt
</code></pre><p>Los nombres del archivo pueden ser encadenados si quieres crear múltiples archivos en un solo comando.</p><pre><code class="language-bash"># creates empty files "file1.txt", "file2.txt", and "file3.txt" in the current folder

touch file1.txt file2.txt file3.txt
</code></pre><h4 id="eliminando-archivos-y-carpetas-usando-el-comando-rm-y-rmdir">Eliminando archivos y carpetas usando el comando <code>rm</code> y <code>rmdir</code></h4><p>Puedes usar el comando <code>rm</code> para eliminar ambos archivos y carpetas no vacías.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Comando</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>rm archivo.txt</code></td>
<td>Elimina el archivo <code>archivo.txt</code></td>
</tr>
<tr>
<td><code>rm -r dir</code></td>
<td>Elimina la carpeta <code>dir</code> y su contenido</td>
</tr>
<tr>
<td><code>rm -f archivo.txt</code></td>
<td>Elimina el archivo <code>archivo.txt</code> sin mostrar un mensaje de confirmación</td>
</tr>
<tr>
<td><code>rmdir</code> carpeta</td>
<td>Elimina una carpeta vacía</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>🛑 Fíjate que deberías usar el argumento <code>-f</code> con cuidado ya que no te preguntará antes de eliminar un archivo. También, ten cuidado cuando ejecutas comandos <code>rm</code> en la carpeta <code>root</code> ya que podría resultar en eliminar archivos importantes de sistema.</p><h4 id="copiando-archivos-usando-el-comando-cp">Copiando archivos usando el comando <code>cp</code></h4><p>Para copiar archivos en Linux, usa el comando <code>cp</code>.</p><ul><li><strong>Sintaxis para copiar archivos:</strong><code>cp source_file destination_of_file</code></li></ul><p>Este comando copia un archivo llamado <code>file1.txt</code> a una nueva ubicación del archivo <code>/home/adam/logs</code>.</p><pre><code class="language-bash">cp file1.txt /home/adam/logs
</code></pre><p>El comando <code>cp</code> también crea una copia de un archivo con el nombre provisto.</p><p>Este comando copia un archivo llamado <code>file1.txt</code> a otro archivo llamado <code>file2.txt</code> en la misma carpeta.</p><pre><code class="language-bash">cp file1.txt file2.txt
</code></pre><h4 id="moviendo-y-renombrando-archivos-y-carpetas-usando-el-comando-mv">Moviendo y renombrando archivos y carpetas usando el comando <code>mv</code></h4><p>El comando <code>mv</code> se usa para mover archivos y carpetas de una carpeta a otra.</p><p><strong>Sintaxis para mover archivos: </strong><code>mv source_file destination_directory</code></p><p><strong>Ejemplo:</strong> Mover un archivo llamado <code>file1.txt</code> a una carpeta llamada <code>backup</code>:</p><pre><code class="language-bash">mv file1.txt backup/
</code></pre><p>Para mover una carpeta y sus contenidos:</p><pre><code class="language-bash">mv dir1/ backup/
</code></pre><p>Renombrando archivos y carpetas en Linux también se hace con el comando <code>mv</code>.</p><p><strong>Sintaxis para renombrar archivos: </strong><code>mv old_name new_name</code></p><p><strong>Ejemplo:</strong> Renombrar un archivo de <code>file1.txt</code> a <code>file2.txt</code>:</p><pre><code class="language-bash">mv file1.txt file2.txt
</code></pre><p>Renombrar una carpeta de <code>dir1</code> a <code>dir2</code>:</p><pre><code class="language-bash">mv dir1 dir2
</code></pre><!--kg-card-begin: html--><h3 id="localizando-archivos-y-carpetas">4.4. Localizando archivos y carpetas usando el comando find</h3><!--kg-card-end: html--><p>El comando <code>find</code> te permite buscar eficientemente archivos, carpetas, y un caracter y dispositivos de bloque.</p><p>Abajo está la sintaxis del comando <code>find</code>:</p><pre><code class="language-bash">find /path/ -type f -name file-to-search
</code></pre><p>Donde,</p><ul><li><code>/path</code> es la ruta donde el archivo se espera ser encontrado. Este es el punto de comienzo para buscar archivos. La ruta también pueder ser <code>/</code> o <code>.</code> el cual representa la raíz y la carpeta actual, respectivamente.</li><li><code>-type</code> representa los descriptores del archivo. Pueden ser cualquiera de lo de abajo: <code>f</code> – <strong>Archivo regular</strong> tales como archivos de texto, imágenes, y archivos ocultos. <code>d</code> – <strong>Carpeta</strong>. Estosson las carpetas bajo consideración. <code>l</code> – <strong>Enlace Simbólico</strong>. Los enlaces simbólicos apunta a archivos y son similares a atajos. <code>c</code> – <strong>Dispositivos de Caracteres</strong>. Archivos que se usan para acceder a dispositivos de carecteres se llaman archivos de dispositivo de caracter. Los drivers se comunican con dispositivos de caracteres enviando y recibiendo caracteres individuales (bytes, octetoss). Ejemplos incluyen teclados, tarjetas de sonido, y el ratón. <code>b</code> – <strong>Dispositivos de Bloque</strong>. Archivos que se usan para acceder a dispositivos de bloque se llaman archivos de dipositivos de bloque. Los drivers se comunican con dispositivos de bloque enviando y recibiendo bloques enteros de datos. Ejemplos incluyen USB y CD-ROM.</li><li><code>-name</code> es el nombre del tipo de archivo que quieres buscar.</li></ul><h4 id="c-mo-buscar-archivos-por-nombre-o-extensi-n">Cómo buscar archivos por nombre o extensión</h4><p>Supón que necesitamos encontrar archivos que contienen "style" en sus nombres. Usaremos este comando</p><pre><code class="language-bash">find . -type f -name "style*"
#output
./style.css
./styles.css
</code></pre><p>Ahora digamos que queremos encontrar archivos con una extensión particular como <code>.html</code>. Modificaremos el comando así:</p><pre><code class="language-bash">find . -type f -name "*.html"
# output
./services.html
./blob.html
./index.html
</code></pre><h4 id="c-mo-buscar-archivos-ocultos">Cómo buscar archivos ocultos</h4><p>Un punto al comienzo del nombre de archivo representa archivos ocultos. Son ocultos normalmente pero pueden ser vistos con <code>ls -a</code> en la carpeta actual.</p><p>Podemos modificar el comando <code>find</code> como se muestra abajo para buscar archivos ocultos:</p><pre><code class="language-bash">find . -type f -name ".*"
</code></pre><p><strong>Listar y encontrar archivos ocultos</strong></p><pre><code class="language-bash">ls -la
# contenido de las carpetas
total 5
drwxrwxr-x  2 zaira zaira 4096 Mar 26 14:17 .
drwxr-x--- 61 zaira zaira 4096 Mar 26 14:12 ..
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bash_history
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bash_logout
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bashrc

find . -type f -name ".*"
# salida de find
./.bash_logout
./.bashrc
./.bash_history
</code></pre><p>Arriba puedes ver una lista de archivos ocultos en mi carpeta home.</p><h4 id="c-mo-buscar-archivos-log-y-archivos-de-configuraci-n">Cómo buscar archivos log y archivos de configuración</h4><p>Los archivos logs usualmente tienen la extensión <code>.log</code>, y podemos encontrarlos así:</p><pre><code class="language-bash"> find . -type f -name "*.log"
</code></pre><p>De forma similar, podemos buscar archivos de configuración de esta forma:</p><pre><code class="language-bash"> find . -type f -name "*.conf"
</code></pre><h4 id="c-mo-buscar-otros-archivos-por-tipo">Cómo buscar otros archivos por tipo</h4><p>Podemos buscarpor archivos de bloque de caracteres proveyendo <code>c</code> a <code>-type</code>:</p><pre><code class="language-bash">find / -type c
</code></pre><p>De forma similar, podemos encontrar archivos de bloque de dispositivos usando <code>b</code>:</p><pre><code class="language-bash">find / -type b
</code></pre><h4 id="c-mo-buscar-carpetas">Cómo buscar carpetas</h4><p>En el ejemplo de abajo, encontramos las carpetas usando el argumento <code>-type d</code>.</p><pre><code class="language-bash">ls -l
# lista el contenido de las carpetas
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 hosts
-rw-rw-r-- 1 zaira zaira    0 Mar 26 14:23 hosts.txt
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 images
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:23 style
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 webp 

find . -type d 
# salida de find mostrando carpetas
.
./webp
./images
./style
./hosts
</code></pre><h4 id="c-mo-buscar-archivos-por-tama-o">Cómo buscar archivos por tamaño</h4><p>Un uso increíblemente útil del comando <code>find</code> es listar archivos basados en un tamaño particular.</p><pre><code class="language-bash">find / -size +250M
</code></pre><p>Aquí, estamos listando archivos cuyos tamaños exceden los <code>250MB</code>.</p><p>Otras unidades incluyen:</p><ul><li><code>G</code>: GigaBytes.</li><li><code>M</code>: MegaBytes.</li><li><code>K</code>: KiloBytes</li><li><code>c</code> : bytes.</li></ul><p>Sólo reemplaza con la unidad relevante.</p><pre><code class="language-bash">find &lt;directory&gt; -type f -size +N&lt;Unit Type&gt;
</code></pre><h4 id="c-mo-buscar-archivos-por-tiempo-de-modificaci-n">Cómo buscar archivos por tiempo de modificación</h4><p>Usando el argumento <code>-mtime</code>, puedes filtrar archivos y carpetas basado en el tiempo de modificación.</p><pre><code class="language-bash">find /path -name "*.txt" -mtime -10
</code></pre><p>Por ejemplo,</p><ul><li><strong>-mtime +10</strong> significa que estás buscando un archivo que se modificó hace 10 días.</li><li><strong>-mtime -10</strong> significa menos de 10 días.</li><li><strong>-mtime 10</strong> si te salteas + o – significa exactamente 10 días.</li></ul><!--kg-card-begin: html--><h3 id="comandos-basicos-para-ver-archivos">4.5. Comandos Básicos para ver archivos</h3><!--kg-card-end: html--><h4 id="concatena-y-muestra-archivos-usando-el-comando-cat">Concatena y muestra archivos usando el comando <code>cat</code></h4><p>El comando <code>cat</code> en Linux se usa para mostrar los contenidos de un archivo. También puede ser usado para concatenar y crear nuevos archivos.</p><p>Aquí está la sintaxis básica del comando <code>cat</code>:</p><pre><code class="language-bash">cat [opciones] [archivo]
</code></pre><p>La forma más simple de usar <code>cat</code> es sin ninguna opción o argumento. Esto mostrará los contenidos del archivo en la terminal.</p><p>Por ejemplo, si quieres mostrar los contenidos de un archivo llamado <code>file.txt</code>, puedes usar el siguiente comando:</p><pre><code class="language-bash">cat file.txt
</code></pre><p>Esto mostrará todos los contenidos del archivo en la termina de una sola vez.</p><h4 id="ver-archivos-de-texto-de-forma-interactiva-usando-less-y-more">Ver archivos de texto de forma interactiva usando <code>less</code> y <code>more</code></h4><p>Mientras que <code>cat</code> muestra todo el archivo de una sola vez, <code>less</code> y <code>more</code> te permite ver los contenidos de un archivo de forma interactiva. Esto es útil cuando quieres desplazarte a través de un archivo grande o buscar por contenido específico.</p><p>La sintaxis del comando <code>less</code> es:</p><pre><code class="language-bash">less [opciones] [archivo]
</code></pre><p>El comando <code>more</code> es similar a <code>less</code> pero tiene menos características. Se usa para mostrar los contenidos de un archivo en una pantalla a la vez.</p><p>La sintaxis del comando <code>more</code> es:</p><pre><code class="language-bash">more [opciones] [archivo]
</code></pre><p>Para ambos comandos, puedes usar el <code>la barra de espacio</code> para desplazarte a una página abajo, la tecla <code>Enter</code> para desplazarte una línea abajo, y la tecla <code>q</code> para salir del visualizador.</p><p>Para moverte hacia atrás puedes usar la tecla <code>b</code>, y para moverte hacia adelante puedes usar la tecla <code>f</code>.</p><h4 id="mostrando-la-ltima-parte-de-los-archivos-usando-tail">Mostrando la última parte de los archivos usando <code>tail</code></h4><p>A veces podrías necesitar ver solo las últimas líneas de un archivo en vez de todo el archivo. El comando <code>tail</code> en Linux se usa para mostrar la última parte de un archivo.</p><p>Por ejemplo, <code>tail file.txt</code> mostrará las últimas 10 líneas del archivo <code>file.txt</code> por defecto.</p><p>Si quieres mostrar un número distinto de líneas, puedes usar la opción <code>-n</code> seguido del número de líneas que quieres mostrar.</p><pre><code class="language-bash"># Muestra las últimas 50 líneas del archivo file.txt
tail -n 50 file.txt
</code></pre><p>💡<strong>Consejo:</strong> Otro uso de <code>tail</code> es su opción inmediata (<code>-f</code>). Esta opción te permite ver los contenidos de un archivo a medida que están siendo escritos. Esto es una utilidad útil para ver y monitorear archivos log en tiempo real.</p><h4 id="mostrar-el-comienzo-de-los-archivos-usando-head">Mostrar el comienzo de los archivos usando <code>head</code></h4><p>Así como <code>tail</code> muestra la última parte de un archivo, puedes usar el comando <code>head</code> en Linux para mostrar el inicio de un archivo.</p><p>Por ejemplo, <code>head file.txt</code> mostrará las 10 primera líneas del archivo <code>file.txt</code> por defecto.</p><p>Para cambiar el número de líneas mostradas, puedes usar la opción <code>-n</code> seguido del número de líneas que quieres mostrar.</p><h4 id="contando-palabras-l-neas-y-caracteres-usando-wc">Contando palabras, líneas, y caracteres usando <code>wc</code></h4><p>Puedes contar palabras, líneas y caracteres en un archivo usando el comando <code>wc</code>.</p><p>Por ejemplo, ejecutando <code>wc syslog.log</code> me dio la siguiente salida:</p><pre><code class="language-bash">1669 9623 64367 syslog.log
</code></pre><p>En la salida de arriba,</p><ul><li><code>1669</code> representa el número de líneas en el archivo <code>syslog.log</code>.</li><li><code>9623</code> representa el número de palabras en el archivo <code>syslog.log</code>.</li><li><code>64367</code> representa el número de caracteres en el archivo <code>syslog.log</code>.</li></ul><p>Así que, el comando <code>wc syslog.log</code> contó <code>1669</code> líneas <code>9623</code> palabras, y <code>64367</code> caracteres en el archivo <code>syslog.log</code>.</p><h4 id="comparando-archivo-l-nea-por-l-nea-usando-diff">Comparando archivo línea por línea usando <code>diff</code></h4><p>Comparando y encontrando diferencias entre dos archivos es una tarea común en Linux. Puedes comparar dos archivos justo en la línea de comandos usando el comando <code>diff</code>.</p><p>La sintaxis básica del comando <code>diff</code> es:</p><pre><code class="language-bash">diff [opciones] archivo1 archivo2
</code></pre><p>Aquí hay dos archivos, <code>hello.py</code> y <code>also-hello.py</code>, que compararemos usando el comando <code>diff</code>:</p><pre><code class="language-bash"># contenido de hello.py

def greet(name):
    return f"Hola, {name}!"

user = input("Ingresa tu nombre: ")
print(greet(user))
# contenido de also-hello.py

more also-hello.py
def greet(name):
    return fHola, {name}!

user = input(Ingresa tu nombre: )
print(greet(user))
print("¡Un placer en conocerte!")
</code></pre><ol><li>Verifica si los archivos son similares o no.</li></ol><pre><code class="language-bash">diff -q hello.py also-hello.py
# Salida
Files hello.py and also-hello.py differ
</code></pre><p>2. &nbsp; Ve cómo los archivos difieren. Para eso, puedes usar el argumento <code>-u</code> para ver una salida unificada:</p><pre><code class="language-bash">diff -u hello.py also-hello.py
--- hello.py    2024-05-24 18:31:29.891690478 +0500
+++ also-hello.py    2024-05-24 18:32:17.207921795 +0500
@@ -3,4 +3,5 @@

 user = input(Ingresa tu nombre: )
 print(greet(user))
+print("Un placer en conocerte")
</code></pre><p>En la salida de arriba:</p><ul><li><code>--- hello.py 2024-05-24 18:31:29.891690478 +0500</code> indica el archivo siendo comparado y su marca de tiempo.</li><li><code>+++ also-hello.py 2024-05-24 18:32:17.207921795 +0500</code> indica el otro archivo siendo comparado y su marca de tiempo.</li><li><code>@@ -3,4 +3,5 @@</code> muestra los número de línea donde los cambios ocurren. En estecaos, indica que las líneas 3 a 4 en el archivo original ha cambiado a las líneas 3 a 5 en el archivo modificado.</li><li><code>user = input(Ingresa tu nombre: )</code> es una línea del archivo original.</li><li><code>print(greet(user))</code> es otra línea del archivo original.</li><li><code>print("Un placer en conocerte")</code> es la línea adicional en el archivo modificado.</li></ul><p>3. &nbsp; Para ver el diff en un formato lado a lado, puedes usar el argumento <code>-y</code>:</p><pre><code class="language-bash">diff -y hello.py also-hello.py
# Salida
def greet(name):                        def greet(name):
    return fHola, {name}!                        return fHola, {name}!

user = input(Ingresa tu nombre: )                    user = input(Enter your name: )
print(greet(user))                        print(greet(user))
                                        &gt;    print("Un placer en conocerte")
</code></pre><p>En la salida:</p><ul><li>Las líneas que están en ambos archivos se muestran lado a lado.</li><li>Las líneas que son distintas se muestran con un símbolo <code>&gt;</code> indicando que la línea está presente solamente en uno de los archivos.</li></ul><!--kg-card-begin: html--><h2 id="parte-5-esencial-sobre-edicion-texto-linux">Parte 5: Lo Esencial sobre Edición de Texto en Linux</h2><!--kg-card-end: html--><p>Las habilidades de edición de texto usando la línea de comandos son una de las habilidades más cruciales en Linux. En esta sección, aprenderás cómo usar dos editores de textos populares en Linux: Vim y Nano.</p><p>Te sugiero que domines cualquier editor de texto de tu gusto y apegarte a él. Te ahorrará tiempo y te hará más productivo. Vim y nano son opciones seguras ya que están presentes en la mayoría de las distribuciones de Linux.</p><!--kg-card-begin: html--><h3 id="dominando-vim-guia-completa">5.1. Dominando Vim: La Guía Completa</h3><!--kg-card-end: html--><h4 id="introducci-n-a-vim">Introducción a Vim</h4><p>Vim es una herramienta de edición de texto popular para la línea de comandos. Vim tiene sus ventajas: es poderoso, personalizable, y rápido. Aquí hay algunas razones de por qué deberías considerar aprender Vim:</p><ul><li>La mayoría de los servidores son accedidos a través de un CLI, así que en administración de sistemas, no es necesario que tengas los lujos de un GUI. Pero Vim te respalda – siempre estarás allí.</li><li>Vim usa un enfoque centrado al teclado, ya que está diseñado para ser usado sin un ratón, lo cual puede acelerar significativamente las tareas de edición una vez que has aprendido los atajos de teclado. Esto también lo hace más rápido que las herramientas GUI.</li><li>Algunas utilidades de Linux, por ejemplo edición de <em>cron jobs</em>, funcionan en el mismo formato de edición como Vim.</li><li>Vim es apropiado para todos – usuarios principiantes y avanzados. Vim suporta búsquedas de cadena complejas, resaltación de búsquedas, y mucho más. A través de los plugins, Vim provee capacidades extendidas para los desarrolladores y administradores de sistema que incluyen completación de código, resaltación de sintaxis, gestión de archivos, control de versiones, y más.</li></ul><p>Vim tiene dos variaciones: Vim (<code>vim</code>) y Vim pequeño (<code>vi</code>). Vim pequeño es una versión más pequeña de Vim que carece de algunas características de Vim.</p><h4 id="c-mo-comenzar-usando-vim">Cómo comenzar usando <code>vim</code></h4><p>Comienza usando Vim con este comando:</p><pre><code class="language-bash">vim your-file.txt
</code></pre><p><code>your-file.txt</code> puede ser un nuevo archivo o un archivo existente que quieres editar.</p><h4 id="navegando-con-vim-dominando-modos-de-movimiento-y-comando">Navegando con Vim: Dominando modos de movimiento y comando</h4><p>A principios del CLI, los teclados no tenían teclas de flecha. Por lo tanto, la navegación se hacía usando el conjunto de teclas disponibles, <code>hjkl</code> siendo uno de ellos.</p><p>Siendo centrado al teclado, usando las teclas <code>hjkl</code> pueden acelerar inmensamente las tareas de edición de texto.</p><p>Nota: aunque las teclas de flecha funcionan bien totalmente, todavías puedes experimentar con las teclas <code>hjkl</code> para navegar. Algunas personas encuentran esta forma de navegar eficiente.</p><p>💡<strong>Consejo:</strong> Para recordar la secuencia de <code>hjkl</code>, usa esto: <strong>h</strong>ang back, <strong>j</strong>ump down, <strong>k</strong>ick up, <strong>l</strong>eap forward (quedarse atrás, saltar hacia abajo, patear, saltar hacia adelante).</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392462442/1a667ede-5f03-4acb-b40f-b10cefc64de3.png" class="kg-image" alt="hjkl navigation guide" width="471" height="274" loading="lazy"></figure><h4 id="los-tres-modos-de-vim">Los tres modos de Vim</h4><p>Necesitas conocer los 3 modos de operando de Vim y cómo cambiarlos. Las pulsaciones de teclas se comportan de forma distinta en cada modo de comando. Los tres modos son los siguientes:</p><ol><li>Modo comando.</li><li>Modo edición.</li><li>Modo Visual.</li></ol><p><strong>Modo Comando.</strong> Cuando comienzas con Vim, llegas al modo comando por defecto. Este modo te permite acceder a otros módulos.</p><p>⚠ Para cambiar a otros modos, necesitas estar presente en el modo comando primero.</p><p><strong>Modo edición</strong></p><p>Este modo te permite hacer cambios al archivo. Para entrar el modo edición, presiona <code>I</code> mientras estás en modo comando. Fíjate el conmutador <code>'-- INSERT'</code> al final de la pantalla.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392526710/d44cecd7-64be-4c89-9a31-dbf395b77fcb.png" class="kg-image" alt="Insert mode in Vim" width="433" height="345" loading="lazy"></figure><p><strong>Modo visual</strong></p><p>Este modo te permite trabajar en un solo caracter, un bloque de texto, o líneas de texto. Vamos a descomponerlo en pasos sencillos. Recuerda, usa las combinaciones de abajo cuando estés en modo comando.</p><ul><li><code>Shift + V</code> → Selecciona múltiples líneas.</li><li><code>Ctrl + V</code> → Modo bloque.</li><li><code>V</code> → Mode caracter.</li></ul><p>El modo visual viene bien cuando necesitas copiar y pegar o editar líneas en masa.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392557097/b61a1515-cac0-4470-856b-b2c15de581e8.gif" class="kg-image" alt="Selectind text using visual mode" width="673" height="422" loading="lazy"></figure><p><strong>Modo comando extendido.</strong></p><p>El modo comando extendido te permite realizar operaciones avanzadas como buscar, establecer números de líneas, y resaltar texto. Cubriremos el modo extendido en la próxima sección.</p><p>¿Cómo mantener el rumbo? Si te olvidas de tu modo actual, solo presiona <code>ESC</code> dos veces y estarás de vuelta en Modo Comando.</p><h4 id="editando-eficientemente-en-vim-copiar-pegar-y-buscar">Editando eficientemente en Vim: Copiar/pegar y buscar</h4><p><strong>1. Cómo copiar y pegar en Vim</strong></p><p>Copiar-pegar es conocido como 'yank' y 'put' en términos de Linux. Para copiar-pegar, sigue estos pasos:</p><ul><li>Selecciona texto en modo visual.</li><li>Presiona <code>'y'</code> para copiar/ yank.</li><li>Mueve tu cursor a la posición requerida y presiona <code>'p'</code>.</li></ul><p><strong>2. Cómo buscar texto en Vim</strong></p><p>Cualquier serie de cadenas puede ser buscado con Vim usando el <code>/</code> en modo comando. Para buscar, usa <code>/string-to-match</code>.</p><p>En el modo comando, escribe <code>:set hls</code> y presiona <code>enter</code>. Busca usando <code>/string-to-match</code>. Esto resaltará las búsquedas.</p><p>Busqueamos unas pocas cadenas:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392684097/11c4a45e-0698-4fb7-bef7-f193684ea21a.gif" class="kg-image" alt="Highlighting searches in Vim" width="800" height="409" loading="lazy"></figure><p><strong>3. Cómo salir de Vim</strong></p><p>Primero, pásate a modo comando (presionando escape dos veces) y luego usa estos argumentos:</p><ul><li>Salir sin guardar → <code>:q!</code></li><li>Salir y guardar → <code>:wq!</code></li></ul><h4 id="atajos-en-vim-haciendo-la-edici-n-m-s-r-pido">Atajos en Vim: Haciendo la edición más rápido</h4><p>Nota: todos estos atajos funcionan solamente en el modo comando.</p><ul><li><strong>Navegación básica</strong></li><li><code>h</code>: Mover a la izquierda</li><li><code>j</code>: Mover hacia abajo</li><li><code>k</code>: Mover hacia arriba</li><li><code>l</code>: Mover a la derecha</li><li><code>0</code>: Mover al principio de la línea</li><li><code>$</code>: Mover al final de la línea</li><li><code>gg</code>: Mover al principio del archivo</li><li><code>G</code>: Mover al final del archivo</li><li><code>Ctrl+d</code>: Mover media página hacia abajo</li><li><code>Ctrl+u</code>: Mover media página hacia arriba</li><li><strong>Editando</strong></li><li><code>i</code>: Ingresa modo insertar antes del cursor</li><li><code>I</code>: Ingresa el modo instertar al principio de la línea</li><li><code>a</code>: Ingresa el modo insertar después del cursor</li><li><code>A</code>: Ingresa el modo insertar al final de la línea</li><li><code>o</code>: Abre una nueva línea debajo de la línea actual e ingresa el modo insertar</li><li><code>O</code>: Abre una nueva línea arriba de la línea actual e ingresa el modo insertar</li><li><code>x</code>: Elimina el caracter debajo del cursor</li><li><code>dd</code>: Elimina la línea actual</li><li><code>yy</code>: Yank (copia) la línea actual (usa esto en modo visual)</li><li><code>p</code>: Pegar debajo del cursor</li><li><code>P</code>: Pegar arriba del cursor</li><li><strong>Buscando y Reemplazando</strong></li><li><code>/</code>: Buscar un patrón el cual te llevará a la próxima ocurriencia</li><li><code>?</code>: Buscar un patrón que te llevará a la ocurrencia previa</li><li><code>n</code>: Repite la última búsqueda en la misma dirección</li><li><code>N</code>: Repite la última búsqueda en la dirección opuesta</li><li><code>:%s/old/new/g</code>: Reemplaza todas las ocurrencias de <code>old</code> con <code>new</code> en el archivo</li><li><strong>Saliendo</strong></li><li><code>:w</code>: Guarda el archivo pero no sale</li><li><code>:q</code>: Sale de Vim (falla si hay cambios no guardados)</li><li><code>:wq</code> or <code>:x</code>: Guardar y sale</li><li><code>:q!</code>: Sale sin guardar</li><li><strong>Múltiples Ventanas</strong></li><li><code>:split</code> or <code>:sp</code>: Divide la ventana horizontalmente</li><li><code>:vsplit</code> or <code>:vsp</code>: Divide la ventana verticalmente</li><li><code>Ctrl+w followed by h/j/k/l</code>: Navega entre ventanas divididas	</li></ul><!--kg-card-begin: html--><h3 id="dominando-nano">5.2. Dominando Nano</h3><!--kg-card-end: html--><h4 id="comenzando-con-nano-el-editor-de-texto-amigable">Comenzando con Nano: El editor de texto amigable</h4><p>Nano es un editor de texto amigable que es fácil de usar y es perfecto para los principiantes. Está pre-instalado en la mayoría de las distribuciones de Linux.</p><p>Para crear un nuevo archivo usando Nano, usa el siguiente comando:</p><pre><code class="language-bash">nano
</code></pre><p>Para empezar a editar un archivo existente con Nano, usa el siguiente comando:</p><pre><code class="language-bash">nano filename
</code></pre><h4 id="lista-de-combinaciones-de-tecla-en-nano">Lista de combinaciones de tecla en Nano</h4><p>Estudiemos las combinaciones de tecla más importantes en Nano. Usará las combinaciones de tecla para realizar varias operaciones como guardar, salir, copiar, pegar, y más.</p><p><strong>Escribir a un archivo y guardar</strong></p><p>Una vez que abres Nano usando el comando <code>nano</code>, puedes comenzar con escribir texto. Para guardar el archivo, presiona <code>Ctrl+O</code>. Te aparecerá una ventana para que ingreses el nombre del archivo. Presiona <code>Enter</code> para guardar el archivo.</p><p><strong>Salir de nano</strong></p><p>Puedes salir de Nano presionando <code>Ctrl+X</code>. Si tienes cambios no guardados, Nano te mostrará una ventana para guardar los cambios antes de salir.</p><p><strong>Copiar y pegar</strong></p><p>Para seleccionar una región, usa <code>ALT+A</code>. Un marcador aparecerá. Usa las flechas para seleccionar el texto. Una vez seleccionado, sale del marcador con <code>ALT+^</code>.</p><p>Para copiar el texto seleccionado, presiona <code>Ctrl+K</code>. Para guardar el texto copiado, presiona <code>Ctrl+U</code>.</p><p><strong>Cortar y pegar</strong></p><p>Selecciona la región con <code>ALT+A</code>. Una vez seleccionado, corta el texto con <code>Ctrl+K</code>. Para pegar el texto cortado, presiona <code>Ctrl+U</code>.</p><p><strong>Navegación</strong></p><p>Usa <code>Alt \</code> para moverte al principio del archivo.</p><p>Usa <code>Alt /</code> para moverte al final del archivo.</p><p><strong>Viendo números de línea</strong></p><p>Cuando abres un archivo con <code>nano -l filename</code>, puedes ver los números de línea en el lado izquierdo del archivo.</p><p><strong>Buscando</strong></p><p>Puedes buscar un número de línea específico con <code>ALt + G</code>. Ingresa el número de línea al prompt y presiona <code>Enter</code>.</p><p>También puedes iniciar una búsqueda de una cadena con <code>CTRL + W</code> y presiona Enter. Si quieres buscar hacia atrás, puedes presionar <code>Alt + W</code> después de iniciar la búsqueda con <code>Ctrl + W</code>.</p><h4 id="resumen-de-combinaciones-de-tecla-en-nano">Resumen de combinaciones de tecla en Nano</h4><ul><li><strong>General</strong></li><li><code>Ctrl+X</code>: Sale de Nano (sale una ventana para guarda si se hacen cambios)</li><li><code>Ctrl+O</code>: Guarda el archivo</li><li><code>Ctrl+R</code>: Lee un archivo en un archivo actual</li><li><code>Ctrl+G</code>: Muestra el texto de ayuda</li><li><strong>Editando</strong></li><li><code>Ctrl+K</code>: Corta la línea actual y lo almacena en el cutbuffer</li><li><code>Ctrl+U</code>: Guarda los contenidos del cutbuffer en la línea actual</li><li><code>Alt+6</code>: Copia la línea actual y lo almacena en el cutbuffer</li><li><code>Ctrl+J</code>: Justifica el párrafo actual</li><li><strong>Navigación</strong></li><li><code>Ctrl+A</code>: Se mueve al principio de la línea</li><li><code>Ctrl+E</code>: Se mueve al final de la línea</li><li><code>Ctrl+C</code>: Muestra el número de línea actual e información del archivo</li><li><code>Ctrl+_</code> (<code>Ctrl+Shift+-</code>): Va a un número de línea específica (y opcionalmente, una columna)</li><li><code>Ctrl+Y</code>: Se desplaza una página arriba</li><li><code>Ctrl+V</code>: Se desplaza una página abajo</li><li><strong>Buscar y Reemplazar</strong></li><li><code>Ctrl+W</code>: Buscar una cadena (luego <code>Enter</code> para búscar nuevamente)</li><li><code>Alt+W</code>: Repite la última búsqueda pero en la dirección opuesta</li><li><code>Ctrl+\</code>: Busca y reemplaza</li><li><strong>Misceláneos</strong></li><li><code>Ctrl+T</code>: Invoca el corrector ortográfico, si está disponible</li><li><code>Ctrl+D</code>: Elimina el caracter debajo del cursor (no lo corta)</li><li><code>Ctrl+L</code>: Refresca (redibuja) la ventana actual</li><li><code>Alt+U</code>: Deshace la última operación</li><li><code>Alt+E</code>: Rehace la última operación sin terminar</li></ul><!--kg-card-begin: html--><h2 id="parte-6-programacion-en-bash">Parte 6: La Programación en Bash</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="definicion-de-los-scripts-bash">6.1. Definición de los scripts de Bash</h3><!--kg-card-end: html--><p>Un script de Bash es un archivo que contiene una secuencia de comandos que son ejecutados por el programa de bash línea por línea. Ter permite realizar una serie de acciones, tales como navegar a una carpeta específica, crear una carpeta, y lanzar un proceso usando la línea de comandos.</p><p>Al guardar comandos en un script, puedes repetir la misma secuencia de pasos múltiples veces y ejecutarlos al correr el script.</p><!--kg-card-begin: html--><h3 id="ventajas-scripts-bash">6.2. Ventajas de los scripts de Bash</h3><!--kg-card-end: html--><p>La programación en Bash es una herramienta poderosa y versátil para las tareas de administración de sistemas, gestionar los recursos del sistema, y realizar otras tareas de rutinas en sistemas Unix/Linux.</p><p>Algunas ventajas de la programación de scripts son:</p><ul><li><strong>Automatización</strong>: Los scripts de Shell te permiten automatizar tareas y procesos repetitivos, ahorrando tiempo y reducir el riesgo de errores que pueden ocurrir con la ejecución manual.</li><li><strong>Portabilidad</strong>: Los scripts de Shell pueden ser ejecutados en varias plataformas y sistemas operativos, incluyendo Unix, Linux, macOS, e inclusive Windows a través del uso de emuladores o máquinas virtuales.</li><li><strong>Flexibilidad</strong>: Los scripts de Shell son bastantes personalizables y pueden ser fácilmente modificados para adaptarse a requerimientos específicos. También pueden ser combinados con otros lenguajes de programación o utilidades para crear scripts más poderosos.</li><li><strong>Accesibilidad</strong>: Los scripts de Shell son fáciles de escribir y no requieren ninguna herramienta o software especial. Pueden ser editados usando cualquier editor de texto, y la mayoría de sistemas operativos tienen un intérprete de shell incorporado.</li><li><strong>Integración</strong>: Los scripts de Shell pueden ser integrados con otras herramientas y aplicaciones, tales como bases de datos, servidores web, y servicios de la nube, permitiendo automatización más complejo y tareas de gestión de sistema.</li><li><strong>Depuración</strong>: Los scripts de Shell son fáciles de depurar, y la mayoría de los shells tienen herramientas de depuración y reporte de errores incorporados que pueden ayudar a identificar y arreglar problemas rápidamente.</li></ul><!--kg-card-begin: html--><h3 id="vista-general-shell-bash-y-cli">6.3. Vista general del Shell de Bash y la Interfaz de Línea de Comandos</h3><!--kg-card-end: html--><p>Los términos "shell" y "bash" son frecuentemente usados de forma intercambiable. Pero hay una diferencia sutil entre los dos.</p><p>El término "shell" se refiere a un programa que provee una interfaz de línea de comandos para interactuar con un sistema operativo. Bash (Bourne-Again SHell) es uno de los shell de Unix/Linux más usado comúnmente y es la shell predeterminada en muchas distribuciones de Linux.</p><p>Hasta ahora, los comandos que has estado haciendo eran básicamente ingresados en un "shell".</p><p>Aunque Bash es un tipo de shell, hay otras shells disponibles también, tales como Korn shell (ksh), C shell (csh), y Z shell (zsh). Cada shell tiene su propia sintaxis y conjunto de características, pero todos comparten el mismo propósito común de proveer una interfaz de línea de comandos para interactuar con el sistema operativo.</p><p>Puedes determinar tu tipo de shell usando el comando <code>ps</code>:</p><pre><code class="language-markdown">ps
# output:

    PID TTY          TIME CMD
  20506 pts/0    00:00:00 bash &lt;--- the shell type
  20931 pts/0    00:00:00 ps
</code></pre><p>En resumen, mientras que "shell" es un término amplio que se refiere a cualquier programa que provee una interfaz de línea de comandos, "Bash" es un tipo específico de shell que es ampliamente usado en sistemas de Unix/Linux.</p><p>Nota: En esta sección, estaremos usando el shell "bash".</p><!--kg-card-begin: html--><h3 id="como-crear-y-ejecutar-scripts-bash">6.4. Cómo crear y ejecutar scripts de Bash</h3><!--kg-card-end: html--><p><strong>Convenciones de nombramiento de Script</strong></p><p>Por convención de nombramiento, los scripts de Bash terminan con <code>.sh</code>. Sin embargo, los scripts de bash se pueden ejecutar perfectamente sin la extensión <code>sh</code>.</p><p><strong>Agregando el Shebang</strong></p><p>Los scripts de Bash comienzan con un <code>shebang</code>. El <code>shebang</code> es una combinación de <code>bash #</code> y <code>bang !</code> seguido de la ruta del shell bash. Esta es la primer línea del script. El shebang le dice al shell para ejecutarlo a través del shell bash. Shebang es simplemente una ruta absoluta al intérprete del bash.</p><p>Abajo hay un ejemplo de la declaración del shebang.</p><pre><code class="language-bash">#!/bin/bash
</code></pre><p>Puedes encontrar tu ruta del shell bash (lo cual puede variar de lo de arriba) usando el comando:</p><pre><code class="language-bash">which bash
</code></pre><p><strong>Creando tu primer script de bash</strong></p><p>Nuestro primer script muesta un mensaje al usuario que ingrese una ruta. En retorno, sus contenidos serán listados.</p><p>Crea un archivo llamado <code>run_all.sh</code> usando cualquier editor de tu preferencia.</p><pre><code class="language-bash">vim run_all.sh
</code></pre><p>Agrega los siguientes comandos en tu archivo y guárdalo:</p><pre><code class="language-bash">#!/bin/bash
echo "Hoy es " `date`

echo -e "\ningresa la ruta a la carpeta"
read the_path

echo -e "\n tu ruta tiene los siguientes archivos y carpetas: "
ls $the_path
</code></pre><p>Echemos un vistazo más profundamente al script línea por línea. Estoy mostrando el mismo script nuevamente, pero esta vez con números de líneas.</p><pre><code class="language-bash">  1 #!/bin/bash
  2 echo "Hoy es " `date`
  3
  4 echo -e "\ningresa la ruta a la carpeta"
  5 read the_path
  6
  7 echo -e "\n tu ruta tiene los siguientes archivos y carpetas: "
  8 ls $the_path
</code></pre><ul><li><strong>Línea #1</strong>: El shebang (<code>#!/bin/bash</code>) apunta a la ruta del shell bash.</li><li><strong>Línea #2</strong>: El comando <code>echo</code> muestra la fecha y el tiempo actual en la terminal. Fíjate que el <code>date</code> está en comillas invertidas.</li><li><strong>Línea #4</strong>: Queremos que el usuario ingrese una ruta válida.</li><li><strong>Línea #5</strong>: El comando <code>read</code> lee la entrada y lo almacena en la variable <code>the_path</code>.</li><li><strong>Línea #8</strong>: El comando <code>ls</code> toma la variable con la ruta almacenada y muestra los archivos y las carpetas actuales.</li></ul><p><strong>Ejecutando el script de bash</strong></p><p>Para hacer que el script sea ejecutable, asigna permisos de ejecución a tu usuario usando este comando:</p><pre><code class="language-bash">chmod u+x run_all.sh
</code></pre><p>Aquí,</p><ul><li><code>chmod</code> modifica la propiedad de un archivo para el usuario actual :<code>u</code>.</li><li><code>+x</code> agrega los derechos de ejecución al usuario actual. Esto significa que el usuario quien es el propietario ahora puede ejecutar el script.</li><li><code>run_all.sh</code> es el archivo que deseamos ejecutar.</li></ul><p>Puedes ejecutar el script usando cualquier de los métodos mencionados:</p><ul><li><code>sh run_all.sh</code></li><li><code>bash run_all.sh</code></li><li><code>./run_all.sh</code></li></ul><p>Veámoslo la ejecución en acción 🚀</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/run-script-bash-2.gif" class="kg-image" alt="Running a bash script" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="basico-programacion-bash">6.5. Lo básico de la Programación en Bash</h3><!--kg-card-end: html--><h4 id="comentarios-en-la-programaci-n-de-bash">Comentarios en la programación de bash</h4><p>Los comentarios comienzan con un <code>#</code> en la programación de bash. Esto significa que cualquier línea que comience con un <code>#</code> es un comentario y será ignorado por el intérprete.</p><p>Los comentarios son muy útiles en la documentación del código, y es una buena práctica agregarlos para ayudar a otros que entiendan el código.</p><p>Estos son ejemplos de comentarios:</p><pre><code class="language-bash"># Este es un comentario de ejemplo
# Estas dos líneas serán ignorados por el intérprete
</code></pre><h4 id="variables-y-tipos-de-datos-en-bash">Variables y tipos de datos en Bash</h4><p>Las variables te permiten almacenar datos. Puedes usar variables para leer, acceder, y manipular datos en tu script.</p><p>No hay tipos de datos en Bash. En Bash, una variable es capaz de almacenar valores numéricos, caracteres individuales, o cadenas de caracteres.</p><p>En Bash, puedes usar y establecer los valores de variable en las siguientes formas:</p><ol><li>Asignar el valor directamente:</li></ol><pre><code class="language-bash">country=Netherlands
</code></pre><p>2. &nbsp;Asignar el valor basado en la salida obtenido de un programa o comando, usando substitución de comando. Fíjate que <code>$</code> es requerido para acceder al valor de una variable existente.</p><pre><code class="language-bash">same_country=$country
</code></pre><p>Esto asigna el valor de <code>country</code> a la nueva variable <code>same_country</code>.</p><p>Para acceder el valor de la variable, adjunta <code>$</code> al nombre de la variable.</p><pre><code class="language-bash">country=Netherlands
echo $country
# salida
Netherlands
new_country=$country
echo $new_country
# salida
Netherlands
</code></pre><p>Arriba, puedes ver un ejemplo de asignamiento e impresión de valores de variable.</p><h4 id="convenciones-de-nombramiento-de-variable">Convenciones de nombramiento de Variable</h4><p>En la programación de Bash, lo siguiente son convenciones de nombramiento de variable:</p><ol><li>Los nombres de variables deberían comenzar con una letra o un guión bajo (<code>_</code>).</li><li>Los nombres de variables pueden contener letras, números, y guiones bajos (<code>_</code>).</li><li>Los nombres de variables son distinguen mayúsculas y minúsculas.</li><li>Los nombres de variables no deberían contener espacios o caracteres especiales.</li><li>Una nombres descriptivos que reflejan el propósito de la variable.</li><li>Evita usar palabras claves reservadas, tales como <code>if</code>, <code>then</code>, <code>else</code>, <code>fi</code>, y así sucesivamente como nombres de variables.</li></ol><p>Aquí hay algunos ejemplos de nombres de variables válidos en Bash:</p><pre><code class="language-bash">name
count
_var
myVar
MY_VAR
</code></pre><p>Y aquí hay algunos ejemplos de nombres de variables inválidos:</p><pre><code class="language-bash"># Nombres de variables inválidos

2ndvar (nombre de variable comienza con un número)
my var (nombre de variable contiene un espacio)
my-var (nombre de variable contains un guión)
</code></pre><p>Siguiendo estas convenciones de nombramiento ayudan en hacer que los scripts de Bash sean más legibles y más fáciles de mantener.</p><h4 id="entradas-y-salidas-en-scripts-de-bash">Entradas y salidas en scripts de Bash</h4><h4 id="recopilaci-n-de-entradas">Recopilación de entradas</h4><p>En esta sección, discutiremos algunos métodos para proveer entradas a nuestros scripts.</p><ol><li>Leer las entradas de usuario y almacenarlos en una variable</li></ol><p>Podemos leer la entrada de usuario usando el comando <code>read</code>.</p><pre><code class="language-bash">#!/bin/bash
echo "What's your name?"
read entered_name
echo -e "\nWelcome to bash tutorial" $entered_name
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh.gif" class="kg-image" alt="Reading the name from a script" width="600" height="400" loading="lazy"></figure><p>2. &nbsp; Leer de un archivo</p><p>Este código lee cada línea de un archivo llamado <code>input.txt</code> y lo imprime a la terminal. Estudiaremos los bucles while más tarde en esta sección.</p><pre><code class="language-bash">while read line
do
  echo $line
done &lt; input.txt
</code></pre><p>3. &nbsp; Argumentos de línea de comandos</p><p>En un script de bash o función, <code>$1</code> denota el argumento inicial pasado, <code>$2</code> denota el segundo argumento pasado, y así sucesivamente.</p><p>Este script toma un nombre como argumento de línea de comandos e imprime un saludo personalizado.</p><pre><code class="language-bash">#!/bin/bash
echo "Hello, $1!"
</code></pre><p>Hemos suplido <code>Zaira</code> como nuestro argumento al script.</p><p><strong>Salida:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh-1.gif" class="kg-image" alt="Providing arguments to the bash script" width="600" height="400" loading="lazy"></figure><h4 id="mostrando-la-salida-">Mostrando la salida:</h4><p>Aquí discutiremos algunos métodos para recibir salidas de los scripts.</p><ol><li>Imprimiendo a la terminal:</li></ol><pre><code class="language-bash">echo "Hello, World!"
</code></pre><p>Esto imprime el texto "Hello, World!" a la terminal.</p><p>2. &nbsp; Escribiendo a un archivo:</p><pre><code class="language-bash">echo "This is some text." &gt; output.txt
</code></pre><p>Esto escribe el teto "This is some text." a un archivo llamado <code>output.txt</code>. Fíjate que el operador <code>&gt;</code> sobreescribe un archivo si éste ya tenía algo de contenido.</p><p>3. &nbsp; Adjuntando a un file:</p><pre><code class="language-bash">echo "More text." &gt;&gt; output.txt
</code></pre><p>Esto adjunta el texto "More text." al final del archivo <code>output.txt</code>.</p><p>4. &nbsp; Redireccionando la salida:</p><pre><code class="language-bash">ls &gt; files.txt
</code></pre><p>Esto lista los archivos en la carpeta actual y escribela salida a un archivo llamado <code>files.txt</code>. Puede redireccionar la salida de cualquier comando a un archivo de esta forma.</p><p>Aprenderás sobre redirección de salida en detalle en la sección 8.5.</p><h4 id="declaraciones-condicionales-if-else-">Declaraciones condicionales (if/else)</h4><p>Las expresiones que producen un resultado booleano, sea verdadero o falso, son llamados condiciones. Hay varias formas de evaluar condiciones, incluyendo <code>if</code>, <code>if-else</code>, <code>if-elif-else</code>, y condicionales anidadas.</p><p><strong>Sintaxis</strong>:</p><pre><code class="language-bash">if [[ condition ]];
then
    statement
elif [[ condition ]]; then
    statement 
else
    do this by default
fi
</code></pre><h4 id="sintaxis-de-las-declaraciones-condicionales-de-bash">Sintaxis de las declaraciones condicionales de bash</h4><p>Podemos usar operadores lógicos tales como AND <code>-a</code> y OR <code>-o</code> para hacer comparaciones que tienen más significado.</p><pre><code class="language-bash">if [ $a -gt 60 -a $b -lt 100 ]
</code></pre><p>Esta declaración verifica si ambas condiciones son <code>true</code>: <code>a</code> es más grande que <code>60</code> Y <code>b</code> es menor que <code>100</code>.</p><p>Veamos un ejemplo de un script de Bash que usa declaraciones <code>if</code>, <code>if-else</code>, y <code>if-elif-else</code> para determinar si un número ingresado por el usuario es positivo, negativo, o cero:</p><pre><code class="language-bash">#!/bin/bash

# Script to determine if a number is positive, negative, or zero

echo "Please enter a number: "
read num

if [ $num -gt 0 ]; then
  echo "$num is positive"
elif [ $num -lt 0 ]; then
  echo "$num is negative"
else
  echo "$num is zero"
fi
</code></pre><p>El script primero muestra un mensaje al usuario para que ingrese un número. Luego, usa una declaración <code>if</code> para verificar si el número es más grande que <code>0</code>. Si lo es, el script muestra que el número es positivo. Si el número no es más grande que <code>0</code>, el script se mueve a la siguiente declaración, el cual es una declaración <code>if-elif</code>.</p><p>Aquí, el script verifica si el número es menor que <code>0</code>. Si lo es, el script muestra que el número es negativo.</p><p>Finalmente, si el número no es más grande que <code>0</code> ni menor que <code>0</code>, el script usa una declaración <code>else</code> para mostrar que el número es cero.</p><p>Viéndolo en acción 🚀</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/test-odd.gif" class="kg-image" alt="Checking if a number is even or odd" width="600" height="400" loading="lazy"></figure><h4 id="bucles-y-ramificaci-n-en-bash">Bucles y ramificación en Bash</h4><p><strong>Bucle while</strong></p><p>Los bucles while verifica una condición y un bucle hasta que la condición permanece <code>true</code>. Necesitamos proveer una declaración counter que incrementa el contador para controlar la ejecución del bucle.</p><p>En el ejemplo abajo, <code>(( i += 1 ))</code> es la declaración del counter que incrementa el valor de <code>i</code>. El bucle ejecutará exactamente 10 veces.</p><pre><code class="language-bash">#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-187.png" class="kg-image" alt="Looping from 1 to 10 using " width="600" height="400" loading="lazy"></figure><p><strong>Bucle For</strong></p><p>El bucle <code>for</code>, así como el bucle <code>while</code>, te permite ejecutar declaraciones en un número específico de veces. Cada bucle difiere en su sintaxis y uso.</p><p>En el ejemplo de abajo, el bucle iterará 5 veces.</p><pre><code class="language-bash">#!/bin/bash

for i in {1..5}
do
    echo $i
done
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-186.png" class="kg-image" alt="Looping from 1 to 10 using " width="600" height="400" loading="lazy"></figure><p><strong>Declaraciones Case</strong></p><p>En Bash, las declaraciones case son usados para comparar un número dado contra una lista de patrones y ejecutar un bloque de código basado en el primer patrón que coincida. La sintaxis para una declaración case en Bash es como sigue:</p><pre><code class="language-bash">case expression in
    pattern1)
        # código para ejecutar si la expresión coincide con el patrón1
        ;;
    pattern2)
        # código para ejecutar si la expresión coincide con el patrón2
        ;;
    pattern3)
        # código para ejecutar si la expresión coincide con el patrón3
        ;;
    *)
        # código para ejecutar si ninguno de los patrones de arriba coinciden con la expresión
        ;;
esac
</code></pre><p>Aquí, "expression" es el valor que queremos comparar, y "pattern1", "pattern2", "pattern3", y así sucesivamente son los patrones con las que queremos comparar.</p><p>El doble punto y coma ";;" separa cada bloque de código para ejecutar cada patrón. El asterisco "*" representa el case por defecto, el cual se ejecuta si ninguno de los patrones especificados coinciden con la expresión.</p><p>Veamos un ejemplo:</p><pre><code class="language-bash">fruit="apple"

case $fruit in
    "apple")
        echo "This is a red fruit."
        ;;
    "banana")
        echo "This is a yellow fruit."
        ;;
    "orange")
        echo "This is an orange fruit."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac
</code></pre><p>En este ejemplo, ya que el valor de <code>fruit</code> es <code>apple</code>, el primer patrón ocincide, y el bloque de código que imprime <code>This is a red fruit.</code> se ejecuta. Si el valor de <code>fruit</code> era <code>banana</code>, el segundo patrón coincidiría y el bloque de código que imprime <code>This is a yellow fruit.</code> se ejecutaría, etcétera.</p><p>Si el valor de <code>fruit</code> no coincide con ninguno de los patrones especificados, el caso predeterminado se ejecuta, el cual imprime <code>Unknown fruit.</code>.</p><!--kg-card-begin: html--><h2 id="parte-7-manejo-paquetes-software-linux">Parte 7: Manejo de Paquetes de Software en Linux</h2><!--kg-card-end: html--><p>Linux viene con varios programas incorporados. Pero podrías necesitar instalar nuevos programas basado en tus necesidades. También podrías necesitar actualizar las aplicaciones existentes.</p><!--kg-card-begin: html--><h3 id="paquetes-y-gestion-paquetes">7.1. Paquetes y Gestión de Paquetes</h3><!--kg-card-end: html--><h4 id="-qu-es-un-paquete">¿Qué es un paquete?</h4><p>Un paquete es una colección de archivos que se empaquetan juntos. Estos archivos son esenciales para que un programa en particular se ejecute. Estos archivos contienen los archivos ejecutables del programa, librerías, y otros recursos.</p><p>Además de estos archivos requeridos para el programa para que se ejecute, los paquetes también contienen scripts de instalación, los cuales copian los archivo a donde se les necesita. Un programa podría contener muchos archivos y dependencias. Con los paquetes, es más fácil de manejar todos los archivos y dependencias de una sola vez.</p><h4 id="-cu-l-es-la-diferencia-entre-fuente-y-binario">¿Cuál es la diferencia entre fuente y binario?</h4><p>Los programadores escriben código fuente en un lenguaje de programación. Este código fuente luego se compila en código máquina el cual la computadora puede entender. El código compilado se llama código binario.</p><p>Cuando descargas un paquete, puedes obtener el <em>código fuente</em> o el <em>código binario</em>. El código fuente es el código legible para los humanos que puede ser compilado en código binario. El código binario es el código compilado que la computadora puede entender.</p><p>Los paquetes fuentes pueden ser usados con cualquier tipo de máquina si el código fuente se compila apropiadamente. El binario, por otro lado, es código compilado que es específico a un tipo particular de máquina o arquitectura.</p><p>Puedes encontrar la arquitectura de tu máquina usando el comando <code>uname -m</code>.</p><pre><code class="language-bash">uname -m
# output
x86_64
</code></pre><h4 id="dependencias-de-un-paquete">Dependencias de un paquete</h4><p>Los programas frecuentemente comparten archivos. En vez de incluir estos archivos en cada paquete, un paquete separado puede proveerlos para todos los programas.</p><p>Para instalar un programa que necesita estos archivo, también debes instalar el paquete que los contiene. Esto se llama una dependencia de paquete. Especificando las dependencias hacen a los paquetes más pequeños y más sencillo al reducir los duplicados.</p><p>Cuando instalas un programa, sus dependencias también deben ser instalados. Las dependencias más requeridas usualmente ya están instaladas, pero unos pares extas podrían ser necesarios. Así que, no te sorprendas si varios paquetes son instalados juntamente con tu paquete deseado. Estos son dependencias necesarias.</p><h4 id="gestores-de-paquetes">Gestores de Paquetes</h4><p>Linux ofrece un sistema comprensivo de gestión de paquetes para instalar, actualizar, configurar, y quitar software.</p><p>Con un gestor de paquetes, puedes obtener acceso a una base organizada de miles de paquetes de software juntamente teniendo la habilidad de resolver dependencias y verificar actualizaciones de software.</p><p>Los paquetes pueden ser manejados usando utilidades de línea de comando que pueden ser fácilmente automatizados por los administradores de sistema, o a través de una interfaz gráfica.</p><h4 id="canales-repositorios-de-software">Canales/Repositorios de Software</h4><p>⚠️ La gestión de paquetes es distinto para diferentes distros. Aquí, estamos usando Ubuntu.</p><p>Instalando software es un poco distinto en Linux comparado a Windows y Mac.</p><p>Linux usa repositorios para almacenar paquetes de software. Un repositorio es una colección de paquetes de software que están disponibles para instalación a través de un gestor de paquetes.</p><p>Un gestor de paquetes también almacena un índice de todos los paquetes disponibles de un repo. A veces el índice se reconstruye para asegurarse que está al día y para saber qué paquetes han sido actualizados o agregados al canal desde la última vez que fue verificado.</p><p>El proceso genérico de descargar software de un repo se parece algo así:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719313472889/f4961606-b9c4-4ed7-8edc-61e0fc6908e4.png" class="kg-image" alt="Rrocess of downloading software from a remote repo" width="1080" height="1080" loading="lazy"></figure><p>Si hablamos específicamente sobre Ubuntu,</p><ol><li>El índice se busca usando <code>apt update.</code> (<code>apt</code> se explica en la próxima sección).</li><li>Los archivos/dependencias requeridas se solicitan según el índice usando <code>apt install</code></li><li>Los paquetes y las dependencias se instalan de manera local.</li><li>Actualiza las dependencias y los paquetes cuando se requiere usando <code>apt update</code> y <code>apt upgrade</code></li></ol><p>En distros basados en Debian, puedes encontrar la lista de repos (repositorios) en &nbsp;<code>/etc/apt/sources.list</code>.</p><!--kg-card-begin: html--><h3 id="instalando-paquete-a-traves-cli">7.2. Instalando un paquete a través de la Línea de Comandos</h3><!--kg-card-end: html--><p>El comando <code>apt</code> es una herramienta de línea de comando poderosa, la cual es parte de Ubuntu y significa "Herramienta de Empaquetamiento Avanzado" ("Advanced Packaging Toll - APT").</p><p><code>apt</code>, junto con los comandos que se empaquetan, provee los medios para instalar nuevos paquetes de software, actualizar paquetes de software existentes, actualizar el índice de lista de paquetes, e inclusive actualizar el sistema de Ubuntu completo.</p><p>Para ver los archivos log de la instalación usando <code>apt</code>, puedes ver el archivo <code>/var/log/dpkg.log</code>.</p><p>Lo siguiente son los usos del comando <code>apt</code>:</p><h4 id="instalando-paquetes">Instalando paquetes</h4><p>Por ejemplo, para instalar el paquete <code>htop</code>, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt install htop
</code></pre><h4 id="actualizando-el-ndice-de-la-lista-de-paquetes">Actualizando el índice de la lista de paquetes</h4><p>El índice de lista de paquetes es una lista de todos los paquetes disponibles en los repositorios. Para actualizar el índice de la lista de paquetes local, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt update
</code></pre><h4 id="actualizando-los-paquetes">Actualizando los paquetes</h4><p>Los paquetes instalados en tu sistema puede obtener actualizaciones que contienen correcciones de errores, parches de seguridad, y nuevas características.</p><p>Para actualizar los paquetes, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt upgrade
</code></pre><h4 id="quitando-los-paquetes">Quitando los paquetes</h4><p>Para quitar un paquete, como <code>htop</code>, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt remove htop
</code></pre><!--kg-card-begin: html--><h3 id="instalando-paquete-a-traves-gui-synaptic">7.3. Instalando un paquete a través de un Método Gráfico Avanzado – Synaptic</h3><!--kg-card-end: html--><p>Si no estás cómodo con la línea de comando, puedes usar una aplicación GUI para instalar paquetes. Puedes alcanzar los mismos resultado como con la línea de comandos, pero con una interfaz gráfica.</p><p>Synaptic es una aplicación GUI de gestión de paquetes que ayuda en lista los paquetes instalados, su estado, actualizaciones pendientes, y así sucesivamente. Ofrece filtros personalizables para ayudarte en reducir los resultados de búsqueda.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719313599636/0f362ed7-c371-4a58-96c2-c359178cdbd9.png" class="kg-image" alt="0f362ed7-c371-4a58-96c2-c359178cdbd9" width="1356" height="868" loading="lazy"></figure><p>También puedes hacer clic derecho en un paquete y ver más detalles como las dependencias, el mantenedor, y los archivos instalados.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719313607397/33b7ad76-2492-4805-8133-35c8cd3c4a0a.png" class="kg-image" alt="View a package's detail" width="560" height="634" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="instalando-paquetes-descargados">7.4. Instalando paquetes descargados de un sitio web</h3><!--kg-card-end: html--><p>Podrías querer instalar un paquete que has descargado de un sitio web, en vez de un repositorio de software. Estos paquetes se llaman archivos <code>.deb</code>.</p><p><strong>Usando <code>dpkg</code> para instalar paquetes</strong>: &nbsp;<code>dpkg</code> es una herramienta de línea de comando que se usa para instalar paquetes. Para instalar un paquete con <strong>dpkg</strong>, abre la Terminal y escribe lo siguiente:</p><pre><code class="language-bash">cd directory
sudo dpkg -i package_name.deb
</code></pre><p>Nota: Reemplazar "directory" con la carptea donde el paquete se almacena y "package_name" con el nombre del archivo del paquete.</p><p>De forma alternativa, puedes hacer clic derecho, selecciona "Open With Other Application", y elige una app GUI de tu gusto.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719322161581/f16d83ac-ca9a-4502-a80c-e6a25dee5c68.png" class="kg-image" alt="Installing a software using an app" width="534" height="505" loading="lazy"></figure><p>💡 <strong>Consejo:</strong> En Ubuntu, puedes ver una lista de paquetes instalados con <code>dpkg --list</code>.</p><!--kg-card-begin: html--><h2 id="parte-8-temas-linux-avanzados">Parte 8: Temas de Linux Avanzados</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="gestion-del-usuario">8.1. Gestión de Usuario</h3><!--kg-card-end: html--><p>Pueden haber múltiples usuario con niveles variantes de acceso en un sistema. En Linux, el usuario root tiene el nivel más alto de acceso y puede realizar cualquier operación en el sistema. Los usuarios regulares tienen acceso limitado y solamente puede realizar operaciones de las que se les ha dado permiso para hacer.</p><h4 id="-qu-es-un-usuario">¿Qué es un usuario?</h4><p>Una cuenta de usuario provee separación entre distintas personas y programas que pueden ejecutar comandos.</p><p>Los humanos identifican a los usuarios por nombre, ya que los nombres son fáciles con los que trabajar. Pero el sistema identifica a los usuarios por un número único llamado el ID de usuario (UID).</p><p>Cuando los usuarios humano inician sesión usando el nombre de usuario provisto, tienen que usar una contraseña para autorizarse a ellos mismos.</p><p>Las cuentas de usuario forman los fundamentos de la seguridad del sistema. La propiedad de archivo también está asociado con las cuentas de usuario y refuerza el control de acceso a los archivos. Cada proceso tiene una cuenta de usuario asociado que provee una capa de control para los administradores.</p><p>Hay tres tipos principales de cuentas de usuario:</p><ol><li><strong>Superusuario</strong>: El superusuario tiene acceso completo al sistema. El nombre del superusuario es <code>root</code>. Tiene un <code>UID</code> de 0.</li><li><strong>Usuario de sistema</strong>: El usuario de sistema tiene cuentas de usuario que se usan para ejecutar servicios de sistema. Estas cuentas se usan para ejecutar servicios de sistema y no están destinados para la interacción humana.</li><li><strong>Usuario regular</strong>: Los usuarios regulares son usuarios humanos que tienen acceso al sistema.</li></ol><p>El comando <code>id</code> muestra el ID de usuario y el ID de grupo del usuario actual.</p><pre><code class="language-bash">id
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),24(cdrom),27(sudo),30(dip)... output truncated
</code></pre><p>Para ver las información básica de otro usuario, pasa el nombre de usuario como argumento al comando <code>id</code>.</p><pre><code class="language-bash">id username
</code></pre><p>Para ver la información relacionado al usuario para los procesos, usa el comando <code>ps</code> con el argumento <code>-u</code>.</p><pre><code class="language-bash">ps -u
# Salida
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  16968  3920 ?        Ss   18:45   0:00 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    18:45   0:00 [kthreadd]
</code></pre><p>Por defecto, los sistemas usan el archivo <code>/etc/passwd</code> para almacenar información de usuario.</p><p>Aquí hay una línea del archivo <code>/etc/passwd</code>:</p><pre><code class="language-bash">root:x:0:0:root:/root:/bin/bash
</code></pre><p>El archivo <code>/etc/passwd</code> contiene la siguiente información sobre cada usuario:</p><ol><li>Nombre de usuario: <code>root</code> – El nombre de usuario de la cuenta de usuario.</li><li>Contraseña: <code>x</code> – La contraseña en formato encriptado para la cuenta de usuario que se almacena en el archivo <code>/etc/shadow</code> por razones de seguridad.</li><li>ID de Usuario (UID): <code>0</code> – El identificador numérico único para la cuenta de usuario.</li><li>ID de Grupo (GID): <code>0</code> – El identificador del grupo primario para la cuenta de usuario.</li><li>Información de Usuario: <code>root</code> – El nombre real para la cuenta de usuario.</li><li>Carpeta Home: <code>/root</code> – The home directory for the user account.</li><li>Shell: <code>/bin/bash</code> – El shell predeterminado para la cuenta de usuario. Un usuario de sistema podría usar <code>/sbin/nologin</code> si los inicios de sesión interactivos no están permitidos para ese usuario.</li></ol><h4 id="-qu-es-un-grupo">¿Qué es un grupo?</h4><p>Un grupo es una colección de cuentas de usuario que comparten acceso compartido y recursos. Los grupos tienen nombres de grupo para identificarlos. El sistema identifica a los grupos por un número único llamado el ID del Grupo (GID).</p><p>Por defecto, la información sobre los grupos se almacenan en el archivo <code>/etc/group</code>.</p><p>Aquí hay una entrada del archivo <code>/etc/group</code>:</p><pre><code class="language-bash">adm:x:4:syslog,john
</code></pre><p>Aquí está el desglose de los campos en la entrada dada:</p><ol><li>Nombre de Grupo: <code>adm</code> – El nombre del grupo.</li><li>Contraseña: <code>x</code> – La contraseña para el grupo se almacena en el archivo <code>/etc/gshadow</code> por razones de seguridad. La contraseña es opcional y aparece vacío si no se pone una.</li><li>ID del Grupo (GID): <code>4</code> – El identificador numérico único para el grupo.</li><li>Miembros del Grupo: <code>syslog,john</code> – La lista de nombres de usuario que son miembros del grupo. En este caso, el grupo <code>adm</code> tiene dos miembros: <code>syslog</code> y <code>john</code>.</li></ol><p>En esta entrada específica, el nombre del grupo es <code>adm</code>, el ID del grupo es <code>4</code>, y el grupo tiene dos miembros: <code>syslog</code> y <code>john</code>. El campo contraseña es normalmente puesto a <code>x</code> para indicar que la contraseña del grupo se almacena en el archivo <code>/etc/gshadow</code>.</p><p>Los grupos están divididos en grupos '<em>primario</em>' y '<em>suplementario</em>'.</p><ul><li>Grupo primario: Cada usuario es asignado un grupo primario por defecto. Este grupo usualmente tiene el mismo nombre como el usuario y se crea cuando la cuenta de usuario se crea. Los archivos y las carpetas creadas por el usuario son normalmente propiedad de este grupo primario.</li><li>Grupos Suplementarios: Estos son grupos extras a los que un usuario puede pertenecer además de su grupo primario. Los usuarios pueden ser miembros de múltiples grupos suplementarios. Estos grupos permiten a usuario que tenga permisos para los recursos compartidos entre esos grupos. Ayudan a proveer acceso a recursos compartidos sin afectar los permisos del archivo de sistema y manteniendo la seguridad intacta. Mientras que usuario debe pertenecer a un grupo primario, pertenecer a grupos suplementarios is opcional.</li></ul><h4 id="control-de-acceso-encontrar-y-entender-permisos-de-archivo">Control de acceso: encontrar y entender permisos de archivo</h4><p>La propiedad de archivo puede ser visto usando el comando <code>ls -l</code>. La primera columna en la salida del comando <code>ls -l</code> muestra los permisos del archivo. Otras columnas muestra al propietario del archivo y el grupo al que el archivo pertenece.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-146.png" class="kg-image" alt="Detailed output of ls -l" width="600" height="400" loading="lazy"></figure><p>Echemos un vistazo más cercano en la columna <code>mode</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-147.png" class="kg-image" alt="Permission classes and file types" width="600" height="400" loading="lazy"></figure><p><strong>Mode</strong> define dos cosas:</p><ul><li><strong>Tipo de archivo:</strong> El tipo de archivo define el tipo de archivo. Para archivos regulares que contienen un dato simple está en blanco <code>-</code>. Para otros tipos de archivos especiales el símbolo es distinto. Para una carpeta el cual es un archivo especial, es <code>d</code>. Los archivos especiales son tratados de forma diferente por el SO.</li><li><strong>Clases de Permiso:</strong> El próximo conjunto de caracteres define los permisos para el usuario, el grupo y para otros respectivamente..– <strong>User</strong>: Este es el propietario de un archivo y el propietario del archivo pertenece a esta clase.– <strong>Group</strong>: Los miembros del grupo del archivo pertenecen a esta clase– <strong>Other</strong>: Cualquier usuario que no son parte de las clases del usuario o del grupo pertenecen a esta clase.</li></ul><p>💡<strong>Consejo:</strong> La propiedad de la carpeta se puede ver usando el comando <code>ls -ld</code>.</p><h5 id="c-mo-leer-permisos-simb-licos-o-los-permisos-de-rwx">Cómo leer permisos simbólicos o los permisos de <code>rwx</code></h5><p>La representación de <code>rwx</code> es conocido como la representación Simbólca de los permisos. En el conjunto de permisos,</p><ul><li><code>r</code> significa <strong>read (leer)</strong>. Se indica en el primer caracter de la tríada.</li><li><code>w</code> significa <strong>write (escribir)</strong>. Se indica en el segundo caracter de la tríada.</li><li><code>x</code> significa <strong>execution (ejecución)</strong>. Se indica en el tercer caracter de la tríada.</li></ul><p><strong>Leer:</strong></p><p>Para archivos regulares, los permisos de lectura permiten al archivo que se abra y sea leído solamente. Los usuarios no pueden modificar el archivo.</p><p>De forma similar para las carpetas, los permisos de lectura permiten el listado del contenido de la carpeta sin ninguna modificación en la carpeta.</p><p><strong>Escribir:</strong></p><p>Cuando los archivos tienen permisos, el usuario puede modificar (editar, eliminar) el archivo y guardarlo.</p><p>Para las carpetas, los permisos de escritura permiten a un usuario a modificar su contenido (crear, eliminar, y renombrar los archivos que contiene), y modificar el contenido de los archivos de los que el usuario tiene permiso.</p><p><strong>Ejemplos de permisos en Linux</strong></p><p>Ahora que sabemos cómo leer permisos, veamos algunos ejemplos.</p><p><code>-rwx------</code>: Un archivo que es accesible y ejecutable solamente por su propietario.</p><p><code>-rw-rw-r--</code>: Un archivo que está abierto a modificaciones por su propietario y su grupo pero no por otros.</p><p><code>drwxrwx---</code>: Una carpeta que puede ser modificado por su propietario y su grupo.</p><p><strong>Ejecutar:</strong></p><p>Para los archivos, los permisos de ejecución permiten al usuario ejecutar un script ejecutable. Para las carpetas, el usuario los puede acceder, y acceder a detalles sobre los archivos en la carpeta.</p><h5 id="c-mo-cambiar-los-permisos-de-archivo-y-propiedad-en-linux-usando-chmod-y-chown">Cómo cambiar los permisos de archivo y propiedad en Linux usando <code>chmod</code> y <code>chown</code></h5><p>Ahora que sabemos las bases de propiedad y permisos, veamos cómo podemos modificar los permisos usando el comando <code>chmod</code>.</p><p><strong>Sintaxis de</strong> <code>chmod</code>:</p><pre><code class="language-bash">chmod permissions filename
</code></pre><p>Donde,</p><ul><li><code>permissions</code> puede ser leído, escrito, ejecutado o una combinación de ellos.</li><li><code>filename</code> es el nombre del archivo para los cuales los permisos necesitan para cambiar. Este parámetro también puede ser una lista &nbsp;de archivos para cambiar permisos en masa.</li></ul><p>Podemos cambiar los permisos usando dos modos:</p><ol><li><strong>Modo simbólico</strong>: este método usa símbolos como <code>u</code>, <code>g</code>, <code>o</code> para representar a los usuarios, a los grupos, y a los otros. Los permisos son representados como <code>r, w, x</code> para lectura, escritura, y ejecución, respectivamente. Puedes modificar los permisos usando +, - y =.</li><li><strong>Modo absoluto</strong>: este método representa los permisos como números octales de 3 dígitos que van desde 0-7.</li></ol><p>Ahora, veámoslos en detalle.</p><h5 id="c-mo-cambiar-los-permisos-usando-el-modo-simb-lico">Cómo cambiar los permisos usando el Modo Simbólico</h5><p>La tabla de abajo resume la representación del usuario:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>REPRESENTACION DEL USUARIO</strong></th>
<th><strong>DESCRIPCION</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>u</td>
<td>usuario/propietario</td>
</tr>
<tr>
<td>g</td>
<td>grupo</td>
</tr>
<tr>
<td>o</td>
<td>otro</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Podemos usar operadores matemáticos para agregar, quitar, y asignar permisos. La tabla de abajo muestra el resumen:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>OPERADOR</strong></th>
<th><strong>DESCRIPCION</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>+</td>
<td>Agrega un permiso a un archivo o carpeta</td>
</tr>
<tr>
<td>–</td>
<td>Quita el permiso</td>
</tr>
<tr>
<td>=</td>
<td>Establece el permiso si no estaba presente antes. También sobreescribe los permisos si se pusieron anteriormente.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Ejemplo:</strong></p><p>Supongamos que tengo un script y quiero hacerlo ejecutable para el propietario del archivo <code>zaira</code>.</p><p>Los permisos de archivos actuales son como sigue:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-161.png" class="kg-image" alt="image-161" width="600" height="400" loading="lazy"></figure><p>Dividamos los permisos así:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-160.png" class="kg-image" alt="Splitting file permissions" width="600" height="400" loading="lazy"></figure><p>Para agregar los derechos de ejecución (<code>x</code>) al propietario (<code>u</code>) usando el modo simbólico, podemos usar el comando de abajo:</p><pre><code class="language-bash">chmod u+x mymotd.sh
</code></pre><p><strong>Salida:</strong></p><p>Ahora, podemos ver que los permisos de ejecución han sido agregados al propietario <code>zaira</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-162.png" class="kg-image" alt="Permission updated" width="600" height="400" loading="lazy"></figure><p><strong>Ejemplos adicionales para cambiar los permisos a través del método simbólico:</strong></p><ul><li>Quitar los permisos de <code>read</code> y <code>write</code> para <code>group</code> y <code>others</code>: <code>chmod go-rw</code>.</li><li>Quitar los permisos de <code>read</code> para <code>others</code>: <code>chmod o-r</code>.</li><li>Asignando los permisos de <code>write</code> a <code>group</code> y sobreescribir el permiso existente: <code>chmod g=w</code>.</li></ul><h5 id="c-mo-cambiar-los-permisos-usando-el-modo-absoluto">Cómo cambiar los permisos usando el Modo Absoluto</h5><p>El modo absoluto usa los números para representar los permisos y operadores matemáticos para modificarlos.</p><p>La tabla de abajo muestra cómo podemos asignar permisos relevantes:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>PERMISO</strong></th>
<th><strong>PROVEER PERMISO</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>lectura</td>
<td>add 4</td>
</tr>
<tr>
<td>escritura</td>
<td>add 2</td>
</tr>
<tr>
<td>ejecución</td>
<td>add 1</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Los permisos pueden ser revocados usando la resta. La tabla de abajo muestra cómo quitar los permisos relevantes.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>PERMISO</strong></th>
<th><strong>QUITAR PERMISO</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>lectura</td>
<td>subtract 4</td>
</tr>
<tr>
<td>escritura</td>
<td>subtract 2</td>
</tr>
<tr>
<td>ejecución</td>
<td>subtract 1</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Ejemplo</strong>:</p><ul><li>Poner <code>read</code> (agregar 4) para <code>user</code>, <code>read</code> (agregar 4) y <code>execute</code> (agregar 1) para el grupo, y solamente <code>execute</code> (agregar 1) para los demás.</li></ul><pre><code>chmod 451 file-name
</code></pre><p>Así es como ejecutamos el cálculo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-163.png" class="kg-image" alt="Calculation breakdown for adding permissions" width="600" height="400" loading="lazy"></figure><p>Fíjate que esto es lo mismo que <code>r--r-x--x</code>.</p><ul><li>Quitar derechos de <code>execution</code> desde <code>other</code> y <code>group</code>.</li></ul><p>Para quitar la ejecución de <code>other</code> y <code>group</code>, resta 1 de la parte de ejecución de los 2 últimos octatos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-164.png" class="kg-image" alt="Calculation breakdown for removing permissions" width="600" height="400" loading="lazy"></figure><ul><li>Asigna <code>read</code>, <code>write</code> y <code>execute</code> a <code>user</code>, <code>read</code> y <code>execute</code> a <code>group</code> y solamente <code>read</code> a los demás.</li></ul><p>Esto debería ser lo mismo que <code>rwxr-xr--</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-165.png" class="kg-image" alt="Calculation breakdown for adding permissions" width="600" height="400" loading="lazy"></figure><h5 id="c-mo-cambiar-la-propiedad-usando-el-comando-chown">Cómo cambiar la Propiedad usando el comando <code>chown</code></h5><p>Luego, aprenderemos cómo cambiar la propiedad de un archivo. Puedes cambiar la propiedad de un archivo o carpeta usando el comando <code>chown</code>. En algunos casos, cambiar la propiedad requiere permisos <code>sudo</code>.</p><p>Sintaxis de <code>chown</code>:</p><pre><code class="language-bash">chown user filename
</code></pre><h5 id="c-mo-cambiar-la-propiedad-de-usuario-con-chown">Cómo cambiar la propiedad de usuario con <code>chown</code></h5><p>Vamos a transferir la propiedad del usuario <code>zaira</code> al usuario <code>news</code>.</p><pre><code>chown news mymotd.sh
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-167.png" class="kg-image" alt="view current owner" width="600" height="400" loading="lazy"></figure><p>El comando para cambiar la propiedad: <code>sudo chown news mymotd.sh</code>.</p><p><strong>Salida:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-168.png" class="kg-image" alt="Ownership changed" width="600" height="400" loading="lazy"></figure><h5 id="c-mo-cambiar-la-propiedad-del-usuario-y-del-grupo-simult-neamente">Cómo cambiar la propiedad del usuario y del grupo simultáneamente</h5><p>También podemos usar <code>chown</code> para cambiar el usuario y el grupo simultáneamente.</p><pre><code class="language-bash">chown user:group filename
</code></pre><h5 id="c-mo-cambiar-la-propiedad-de-carpeta">Cómo cambiar la propiedad de carpeta</h5><p>Puedes cambiar la propiedad recursivamente para los contenidos en una carpeta. El ejemplo de abajo cambia la propiedad de la carpeta <code>/opt/script</code> para permitir al usuario ser <code>admin</code>.</p><pre><code class="language-bash">chown -R admin /opt/script
</code></pre><h5 id="c-mo-cambiar-la-propiedad-de-grupo">Cómo cambiar la propiedad de grupo</h5><p>En caso que solo necesitemos cambiar el propietario del grupo, podemos usar <code>chown</code> al predecir el nombre de grupo con un dos puntos <code>:</code>.</p><pre><code class="language-bash">chown :admins /opt/script
</code></pre><h5 id="c-mo-cambiar-entre-usuarios">Cómo cambiar entre usuarios</h5><p>Podemos cambiar entre usuarios usando el comando <code>su</code>.</p><pre><code class="language-bash">[user01@host ~]$ su user02
Password:
[user02@host ~]$
</code></pre><h5 id="c-mo-ganar-acceso-de-superusuario">Cómo ganar acceso de superusuario</h5><p>El super usuario o el usuario root tiene el nivel de acceso másalto en un sistema Linux. El usuario root puede realizar cualquier operación en el sistema. El usuario root puede acceder a todos los archivos y carpetas, instalar y quitar software, y modificar o sobreescribir configuraciones de sistema.</p><p>Un gran poder conlleva una gran responsabilidad. Si el usuario root está comprometido, alguien puede ganar control completo sobre el sistema. Es aconsejable usar las cuentas de usuario root solamente cuando sea necesario.</p><p>Si omites el nombre de usuario, el comando <code>su</code> cambia a la cuenta de usuario root por defecto.</p><pre><code class="language-bash">[user01@host ~]$ su
Password:
[root@host ~]#
</code></pre><p>Otra variante del comando <code>su</code> es <code>su -</code>. El comando <code>su</code> cambia a la cuenta de usuario root pero no cambia las variables de entorno. El comando <code>su -</code> cambia a la cuenta de usuario root y cambia las variables de entorno a los del usuario objetivo.</p><h5 id="ejecutar-comandos-con-sudo">Ejecutar comandos con sudo</h5><p>Para ejecutar comandos como el usuario <code>root</code> sin cambiar a la cuenta de usuario <code>root</code>, puedes usar el comando <code>sudo</code>. El comando <code>sudo</code> te permite ejecutar comandos con privilegios elevados.</p><p>Ejecutar comandos con <code>sudo</code> es una opción más segura que ejecutar los comandos como usuario <code>root</code>. Esto es porque, solamente un conjunto específico de usuarios se les da el permiso de ejecutar comandos con <code>sudo</code>. Esto se define en el archivo <code>/etc/sudoers</code>.</p><p>También, <code>sudo</code> muestra en un archivo log todos los comandos con los que ejecuto, proveyendo una pista de auditoría de quién ejecutó qué comando y cuándo.</p><p>En Ubuntu, puedes encontrar los archivos log de auditoría aquí:</p><pre><code class="language-bash">cat /var/log/auth.log | grep sudo
</code></pre><p>Para un usuario que no tiene acceso a <code>sudo</code>, se marca en los registros y muestra un mensaje así:</p><pre><code class="language-bash">user01 is not in the sudoers file.  This incident will be reported.
</code></pre><h4 id="manejar-cuentas-de-usuario-locales">Manejar cuentas de usuario locales</h4><h5 id="crear-usuarios-desde-la-l-nea-de-comandos">Crear usuarios desde la línea de comandos</h5><p>El comando usado para agregar un nuevo usuario es:</p><pre><code class="language-bash">sudo useradd username
</code></pre><p>Este comando configura un directorio home del usuario y crea un grupo privado designado por el nombre de usuario del usuario. Actualmente, a la cuenta le falta una contraseña válida, previniendo al usuario de iniciar sesión hasta que una contraseña se cree.</p><h5 id="modificar-los-usuarios-existentes">Modificar los usuarios existentes</h5><p>El comando <code>usermod</code> se usa para modificar usuarios existentes. Aquí hay algunas de las opciones comunes usados con el comando <code>usermod</code>:</p><p>Aquí algunos de los ejemplos del comando <code>usermod</code> en Linux:</p><p><strong>Cambiar un nombre de inicio de sesión del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -l newusername oldusername
</code></pre><p><strong>Cambiar una carpeta de inicio del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -d /new/home/directory -m username
</code></pre><p><strong>Agregar un usuario a un grupo suplementario:</strong></p><pre><code class="language-bash"> sudo usermod -aG groupname username
</code></pre><p><strong>Cambiar un shell del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -s /bin/bash username
</code></pre><p><strong>Bloquear una cuenta de usuario:</strong></p><pre><code class="language-bash"> sudo usermod -L username
</code></pre><p><strong>Desbloquear una cuenta de usuario:</strong></p><pre><code class="language-bash"> sudo usermod -U username
</code></pre><p><strong>Establecer una fecha de vencimiento para una cuenta de usuario:</strong></p><pre><code class="language-bash"> sudo usermod -e YYYY-MM-DD username
</code></pre><p><strong>Cambiar el ID del usuario (UID):</strong></p><pre><code class="language-bash"> sudo usermod -u newUID username
</code></pre><p><strong>Cambiar el grupo primario del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -g newgroup username
</code></pre><p><strong>Quitar un usuario de un grupo suplementario:</strong></p><pre><code class="language-bash">sudo gpasswd -d username groupname
</code></pre><h5 id="eliminar-usuarios">Eliminar usuarios</h5><p>El comando <code>userdel</code> se usa para eliminar una cuenta de usuario y archivos relacionados desde el sistema.</p><ul><li><code>sudo userdel username</code>: quita los detalles del usuario desde <code>/etc/passwd</code> pero mantiene la carpeta de inicio del usuario.</li><li>El comando <code>sudo userdel -r username</code> quita los detalles del usuario desde <code>/etc/passwd</code> y también elimina la carpeta de inicio del usuario.</li></ul><h5 id="cambiar-las-contrase-as-de-usuario">Cambiar las contraseñas de usuario</h5><p>El comando <code>passwd</code> se usa para cambiar la contraseña de usuario.</p><ul><li><code>sudo passwd username</code>: pone la contraseña inicial o cambia la contraseña existente de nombre de usuario. También se usa para cambiar la contraseña del usuario actual que inició sesión.</li></ul><!--kg-card-begin: html--><h3 id="conectandose-sevidores-remotos-a-traves-ssh">8.2 Conectándose a Servidores Remotos a través de SSH</h3><!--kg-card-end: html--><p>Accediendo a los servidores remotos es una de las tareas esenciales para administradores de sistema. Puedes conectarte a distintos servidores o acceder a bases de datos a través de tu máquina local y ejecutar comandos, todos usando SSH.</p><p><strong>¿Qué es el protocol SSH?</strong></p><p>SSH significa Shell Seguro (Secure Shell). Es un protocolo de red criptográfico que permite la comunicación segura entre dos sistemas.</p><p>El puerto predeterminado para SSH es <code>22</code>.</p><p>Los dos participantes mientras se comunican a través de SSH son:</p><ul><li>El servidor: la máquina a la que quieres acceder.</li><li>El cliente: El sistema desde el que estás accediendo al servidor.</li></ul><p>La conexión a un servidor sigue estos pasos:</p><ol><li>Iniciar una Conexión: El cliente envía una petición de conexión al servidor.</li><li>Intercambio de Claves: El servidor envía su clave pública al cliente. Ambos se ponen de acuerdo en el método de encripción a usar.</li><li>Generación de Clave de Sesión: El cliente y el servidor usan el intercambio de claves Diffie-Hellman para crear una clave de sesión compartida.</li><li>Autenticación de Cliente: El Cliente inicia sesión en el servidor usando una contraseña, clave privada, u otro método.</li><li>Comunicación Segura: Después de la autenticación, el cliente y el servidor se comunican de forma segura con encriptación.</li></ol><p><strong>¿Cómo conectarse a un servidor remoto usando SSH?</strong></p><p>El comando <code>ssh</code> es una utilidad incorporada en Linux y también el predeterminado. Hace que el acceso a los servidores bastante fácil y seguro.</p><p>Aquí, estamos hablando sobre cómo el cliente haría una conexión al servidor.</p><p>Antes de conectarse a un servidor, necesitas tener la siguiente información:</p><ul><li>La dirección IP o el nombre de dominio del servidor.</li><li>El nombre de usuario y contraseña del servidor.</li><li>El número de puerto del que tienes acceso en el servidor.</li></ul><p>La sintaxis básica del comando <code>ssh</code> es:</p><pre><code class="language-bash">ssh username@server_ip
</code></pre><p>Por ejemplo, si tu nombre de usuario es <code>john</code> y la IP del servidor es <code>192.168.1.10</code>, el comando sería:</p><pre><code class="language-bash">ssh john@192.168.1.10
</code></pre><p>Después de eso, se te mostrará un mensaje para que ingreses la contraseña secreta. Tu pantalla se verá similar a esto:</p><pre><code class="language-bash">john@192.168.1.10's password: 
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-70-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Jun  5 10:17:32 UTC 2024

  System load:  0.08               Processes:           122
  Usage of /:   12.3% of 19.56GB   Users logged in:     1
  Memory usage: 53%                IP address for eth0: 192.168.1.10
  Swap usage:   0%

Last login: Fri Jun  5 09:34:56 2024 from 192.168.1.2
john@hostname:~$ # start entering commands
</code></pre><p>Ahora puedes ejecutar los comandos relevantes en el servidor <code>192.168.1.10</code>.</p><p>⚠️ El puerto predeterminado para ssh es <code>22</code> pero también es vulnerable, ya que los hackers probablemente intentarán aquí primero. Tu servidor puede exponer otro puerto y compartir el acceso contigo. Para conectarse a un puerto distinto, usa el argumento <code>-p</code>.</p><pre><code class="language-bash">ssh -p port_number username@server_ip
</code></pre><!--kg-card-begin: html--><h3 id="analisis-sintactico-y-analisis-log-avanzado">8.3. Análisis Sintáctico y Análisis de Archivos Log Avanzado</h3><!--kg-card-end: html--><p>Los archivos log, cuando se configuren, son generados por tu sistema por una variedad de razones. Pueden ser usado para rastrear eventos de sistema, monitorear el rendimiento del sistema, y solventar problemas. Son útiles especialmente para los administradores de sistema cuando pueden rastrear errores de aplicación, eventos de red, y actividad de usuario.</p><p>Aquí hay un ejemplo de un archivo log:</p><pre><code class="language-bash"># ejemplo de un archivo log
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 DEBUG Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 WARN Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 DEBUG API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
</code></pre><p>Un archivo log usualmente contiene las siguientes columnas:</p><ul><li>Marca de tiempo: La fecha y el tiempo cuando el evento ocurrió.</li><li>Nivel de Log: La severidad del evento (INFO, DEBUG, WARN, ERROR).</li><li>Componente: El componente del sistema que generó el evento (Startup, Config, Database, User, Security, Network, Email, API, Session, Shutdown).</li><li>Mensaje: Una descripción del evento que ocurrió.</li><li>Información adicional: Información adicional relacionado al evento.</li></ul><p>En sistemas de tiempo real, los archivos log tienden an ser miles de líneas de largo y son generados a cada segundo. Pueden ser verbosos dependiendo de la configuración. Cada columna en un archivo log es una pieza de información que puede ser usado para rastrear problemas. Esto hace que los archivos log sean difíciles de leer y de entender manualmente.</p><p>Aquí es donde viene el análisis de archivos log. El análisis estático de archivos log es el proceso de extraer información útil de los archivos log. Involucra descomponer los archivos log en piezas pequeñas más manejables, y extraer la información relevante.</p><p>La información filtrada también puede ser útil para crear alertas, reportes y paneles.</p><p>En esta sección, explorarás algunas de las técnicas para análisis de archivos log en Linux.</p><h4 id="extracci-n-de-texto-usando-grep">Extracción de texto usando <code>grep</code></h4><p>Grep es una utilidad incorporada de bash. Significa "Búsqueda global de expresiones regulares". Grep se usa para hacer coincidir cadenas en archivos.</p><p>Aquí hay algunos usos comunes de <code>grep</code>:</p><p><strong>Buscar una cadena específica en un archivo:</strong></p><pre><code class="language-bash"> grep "search_string" filename
</code></pre><p>Este comando busca "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Buscar de forma recursiva en las carpetas:</strong></p><pre><code class="language-bash"> grep -r "search_string" /path/to/directory
</code></pre><p>Este comando busca "<code>search_string</code>" en todos los archivos dentro de la carpeta especificada y sus sub-carpetas.</p><p><strong>Ignorar mayúsculas y minúsculas mientras se busca:</strong></p><pre><code class="language-bash"> grep -i "search_string" filename
</code></pre><p>Este comando realiza una búsqueda sin importar mayúsculas o minúsculas de "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Mostrar números de línea con líneas coincidentes:</strong></p><pre><code class="language-bash"> grep -n "search_string" filename
</code></pre><p>Este comando muestra los números de línea juntamente con las líneas coincidentes en el archivo llamado <code>filename</code>.</p><p><strong>Cuenta el número de líneas coincidentes:</strong></p><pre><code class="language-bash"> grep -c "search_string" filename
</code></pre><p>Este comando cuenta el número de líneas que contiene "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Invertir las coincidencias para mostrar líneas que no coinciden:</strong></p><pre><code class="language-bash"> grep -v "search_string" filename
</code></pre><p>Este comando muestra todas las líneas que no contienen "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Busca una palabra entera:</strong></p><pre><code class="language-bash"> grep -w "word" filename
</code></pre><p>Este comando busca la palabra "word" entera en el archivo llamado <code>filename</code>.</p><p><strong>Usar expresiones regulares extendidas:</strong></p><pre><code class="language-bash"> grep -E "pattern" filename
</code></pre><p>Este comando permite el uso de las expresiones regulares extendidas para una coincidencia de patrón más complejo en el archivo llamado <code>filename</code>.</p><p><strong>💡 Consejo:</strong> Si hay múltiples archivos en una carpeta, puedes usar el comando de abajo para encontrar la lista de archivos que contienen las cadenas deseadas.</p><pre><code class="language-bash"># encuentra la lista de archivos que contienen las cadenas deseadas
grep -l "String to Match" /path/to/directory
</code></pre><h4 id="extracci-n-de-texto-usando-sed">Extracción de texto usando <code>sed</code></h4><p><code>sed</code> significa "editor de stream". Procesa flujo de datos, lo que significa que lee datos una línea a la vez. <code>sed</code> te permite buscar patrones y realizar acciones en las líneas que coinciden con esos patrones.</p><p><strong>Sintaxis básica de </strong><code>sed</code>:</p><p>La sintaxis básica de <code>sed</code> es como sigue:</p><pre><code class="language-bash">sed [options] 'command' file_name
</code></pre><p>Aquí, <code>command</code> se usa para realizar operaciones como substitución, eliminación, inserción, y así sucesivamente, en los datos de texto. El nombre de archivo es el nombre del archivo que quieres procesar.</p><p><strong>Uso de </strong><code>sed</code>:</p><p><strong>1. Substitución:</strong></p><p>El argumento <code>s</code> se usa para reemplazar texto. El <code>old-text</code> se reemplaza con <code>new-text</code>:</p><pre><code class="language-bash">sed 's/old-text/new-text/' filename
</code></pre><p>Por ejemplo, para cambiar todas las instancias de "error" a "warning" en el archivo log <code>system.log</code>:</p><pre><code class="language-bash">sed 's/error/warning/' system.log
</code></pre><p><strong>2. Imprimiendo líneas que contienen un patrón específico:</strong></p><p>Usando <code>sed</code> para filtrar y mostrar las líneas que coinciden con un patrón específico:</p><pre><code class="language-bash">sed -n '/pattern/p' filename
</code></pre><p>Por ejemplo, para encontrar todas las líneas que contienen "ERROR":</p><pre><code class="language-bash">sed -n '/ERROR/p' system.log
</code></pre><p><strong>3. Eliminar líneas que contienen un patrón específico:</strong></p><p>Puedes eliminar líneas desde la salida que coinciden un patrón específico:</p><pre><code class="language-bash">sed '/pattern/d' filename
</code></pre><p>Por ejemplo, para quitar todas las líneas que contienen "DEBUG":</p><pre><code class="language-bash">sed '/DEBUG/d' system.log
</code></pre><p><strong>4. Extrayendo campos específicos desde una línea log:</strong></p><p>Puedes usar expresiones regulares para extraer partes de líneas. Supón que cada línea del archivo log comienza con una fecha en el formato "YYYY-MM-DD". Podrías extraer sólo la fecha de cada línea:</p><pre><code class="language-bash">sed -n 's/^\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p' system.log
</code></pre><h4 id="an-lisis-de-texto-con-awk">Análisis de Texto con <code>awk</code></h4><p><code>awk</code> tiene la habilidad de separar cada línea fácilmente en los campos. Es adecuado para procesar texto estructurado como archivos log.</p><p><strong>Sintaxis Básica de </strong><code>awk</code></p><p>La sintaxis básica de <code>awk</code> es:</p><pre><code class="language-bash">awk 'pattern { action }' file_name
</code></pre><p>Aquí, <code>pattern</code> es una condición que se debe cumplir para que <code>action</code> se ejecute. Si el patrón se omite, la acción se ejecuta en cada línea.</p><p>En los próximos ejemplos, usarás este archivo de log como ejemplo:</p><pre><code class="language-bash">2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
  INFO
</code></pre><ul><li><strong>Accediendo a columnas usando </strong><code>awk</code></li></ul><p>Los campos en <code>awk</code> (separados por espacio de forma predeterminada) pueden ser accedidos usando <code>$1</code>, <code>$2</code>, <code>$3</code>, y así sucesivamente.</p><pre><code class="language-bash">zaira@zaira-ThinkPad:~$ awk '{ print $1 }' sample.log
# salida
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25

zaira@zaira-ThinkPad:~$ awk '{ print $2 }' sample.log
# salida
09:00:00
09:01:00
09:02:00
09:03:00
09:04:00
09:05:00
09:06:00
09:07:00
09:08:00
09:09:00
</code></pre><ul><li><strong>Imprimir líneas que contienen un patrón específico (por ejemplo, ERROR)</strong></li></ul><pre><code class="language-bash">awk '/ERROR/ { print $0 }' logfile.log

# salida
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
</code></pre><p>Esto imprime todas las líneas que contienen "ERROR".</p><ul><li><strong>Extraer el primer campo (Fecha y Hora)</strong></li></ul><pre><code class="language-bash">awk '{ print $1, $2 }' logfile.log
# salida
2024-04-25 09:00:00
2024-04-25 09:01:00
2024-04-25 09:02:00
2024-04-25 09:03:00
2024-04-25 09:04:00
2024-04-25 09:05:00
2024-04-25 09:06:00
2024-04-25 09:07:00
2024-04-25 09:08:007
2024-04-25 09:09:00
</code></pre><p>Esto extraerá los dos primeros campos de cada línea, el cual en este caso sería la fecha y hora.</p><ul><li><strong>Resumir las ocurrencias de cada nivel de log</strong></li></ul><pre><code class="language-bash">awk '{ count[$3]++ } END { for (level in count) print level, count[level] }' logfile.log

# output
 1
WARN 1
ERROR 1
DEBUG 2
INFO 6
</code></pre><p>La salida será un resumen del número de ocurrencias de cada nivel de log.</p><ul><li><strong>Filtra campos específicos (por ejemplo, donde el 3er campo es INFO)</strong></li></ul><pre><code class="language-bash">awk '{ $3="INFO"; print }' sample.log

# salida
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
  INFO
</code></pre><p>Este comando extraerá todas las líneas donde el 3er campo es "INFO".</p><p>💡 <strong>Consejo:</strong> El separador predeterminado en <code>awk</code> es un espacio. Si tu archivo log usa un separador distinto, puedes especificarlo usando la opción <code>-F</code>. Por ejemplo, si tu archivo log usa un dos puntos como separador, puedes usar <code>awk -F: '{ print $1 }' logfile.log</code> para extraer el primer campo.</p><h4 id="an-lisis-de-archivos-log-con-cut">Análisis de archivos log con <code>cut</code></h4><p>El comando <code>cut</code> es una comando sencillo aunque potente usado para extraer secciones de texto de cada línea de la entrada. Siempre y cuando los archivos estén estructurados y cada campo esté delimitado por un caracter específico, tales como un espacio, tabulación, o un delimitador personalizado, <code>cut</code> hace un muy buen trabajo al extraer esos campos específicos.</p><p>La sintaxis básica del comando <code>cut</code> es:</p><pre><code class="language-bash">cut [opciones] [archivo]
</code></pre><p>Algunas de las opciones usados comúnmente para el comando <code>cut</code>:</p><ul><li><code>-d</code> : Especifica un delimitador usado como el separador de campo.</li><li><code>-f</code> : Selecciona los campos para que se muestren.</li><li><code>-c</code> : Especifica las posiciones de cada caracter.</li></ul><p>Por ejemplo, el comando de abajo extraería el primer campo (separado por un espacio) de cada línea del archivo log:</p><pre><code class="language-bash">cut -d ' ' -f 1 logfile.log
</code></pre><p><strong>Ejemplos de uso de </strong><code>cut</code> <strong>para análisis de archivos log</strong></p><p>Digamos que tienes un archivo log estructurado como sigue, donde los campos están separados por espacio:</p><pre><code class="language-bash">2024-04-25 08:23:01 INFO 192.168.1.10 User logged in successfully.
2024-04-25 08:24:15 WARNING 192.168.1.10 Disk usage exceeds 90%.
2024-04-25 08:25:02 ERROR 10.0.0.5 Connection timed out.
...
</code></pre><p><code>cut</code> puede ser usado de las siguientes formas:</p><ol><li><strong>Extraer la hora de cada entrada del archivo log</strong>:</li></ol><pre><code class="language-bash">cut -d ' ' -f 2 system.log

# Output
08:23:01
08:24:15
08:25:02
...
</code></pre><p>Este comando usa un espacio como un delimitador y selecciona el segundo campo, el cual es el componente hora de cada entrada del archivo log.</p><p><strong>2. &nbsp;Extraer las direcciones IP de los archivos log</strong>:</p><pre><code class="language-bash">cut -d ' ' -f 4 system.log

# Output
192.168.1.10
192.168.1.10
10.0.0.5
</code></pre><p>Este comando extraer el cuarto campo, el cual es la dirección IP de cada entrada del log.</p><p><strong>3. &nbsp;Extraer niveles de log (INFO, WARNING, ERROR)</strong>:</p><pre><code class="language-bash">cut -d ' ' -f 3 system.log

# Salida
INFO
WARNING
ERROR
</code></pre><p>Esto extrae el tercer campo el cual contiene el nivel log.</p><p><strong>4. &nbsp;Combinando</strong> <code>cut</code> <strong>con otros comandos:</strong></p><p>La salida de otros comandos puede ser canalizado al comando <code>cut</code>. Digamos que quieres filtrar los logs antes de cortar. Puedes usar <code>grep</code> para extraer las líneas que contienen "ERROR" y luego usa <code>cut</code> para obtener información específica de esas líneas:</p><pre><code class="language-bash">grep "ERROR" system.log | cut -d ' ' -f 1,2 

# Output
2024-04-25 08:25:02
</code></pre><p>Este comando primero filtra las líneas que incluyen "ERROR", luego extrae la fecha y hora de estas líneas.</p><p><strong>5. &nbsp;Extraer múltiples campos</strong>:</p><p>Es posible extraer múltiples campos a la vez al especificar un rango o una lista de campos separado por coma:</p><pre><code class="language-bash">cut -d ' ' -f 1,2,3 system.log` 

# Salida
2024-04-25 08:23:01 INFO
2024-04-25 08:24:15 WARNING
2024-04-25 08:25:02 ERROR
...
</code></pre><p>El comando de arriba extrae los tres primeros campos de cada entrada log que son la fecha, hora, y nivel log.</p><h4 id="an-lisis-sint-ctico-de-archivos-log-con-sort-y-uniq">Análisis sintáctico de archivos log con <code>sort</code> y <code>uniq</code></h4><p>Ordenar y quitar duplicados son operaciones comunes cuando se trabaja con archivos log. Los comandos <code>sort</code> y <code>uniq</code> son comandos poderosos usados para ordenar y quitar duplicados de las entradas, respectivamente.</p><p><strong>Sintaxis básica de sort</strong></p><p>El comando <code>sort</code> organiza las líneas de texto de forma alfabética o numérica.</p><pre><code class="language-bash">sort [opciones] [archivo]
</code></pre><p>Algunas opciones claves para el comando sort:</p><ul><li><code>-n</code>: Ordena el archivo asumiendo que los contenidos son numéricos.</li><li><code>-r</code>: Invierte el orden de sort.</li><li><code>-k</code>: Especifica una clave o número de columna con el cual ordena.</li><li><code>-u</code>: Ordena y quita líneas duplicadas.</li></ul><p>El comando <code>uniq</code> se usa para filtrar o contar y reportar líneas repetidas en un archivo.</p><p>La sintaxis de <code>uniq</code> es:</p><pre><code class="language-bash">uniq [opciones] [archivo_entrada] [archivo_salida]
</code></pre><p>Algunas opciones claves para el comando <code>uniq</code> son:</p><ul><li><code>-c</code>: Prefija líneas por el número de ocurrencias.</li><li><code>-d</code>: Solamente imprime líneas duplicadas.</li><li><code>-u</code>: Solamente imprime líneas únicas.</li></ul><h4 id="ejemplos-de-usar-sort-y-uniq-juntos-para-an-lisis-de-archivos-log">Ejemplos de usar <code>sort</code> y <code>uniq</code> juntos para análisis de archivos log</h4><p>Asumamos las siguientes de entradas de registro de ejemplo para estas demostraciones:</p><pre><code class="language-bash">2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-26 ERROR Connection timed out.
</code></pre><ol><li><strong>Ordenar entradas log por fecha</strong>:</li></ol><pre><code class="language-bash">sort system.log

# Salida
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Esto ordena las entradas log de forma alfabética, el cual ordena efectivamente por fecha si la fecha es el primer campo.</p><p><strong>2. &nbsp;Ordenar y quitar duplicados</strong>:</p><pre><code class="language-bash">sort system.log | uniq

# Salida
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Este comando ordena el archivo log y lo canaliza a <code>uniq</code>, quitando líneas duplicadas.</p><p><strong>3. &nbsp;Contando ocurrencias de cada línea</strong>:</p><pre><code class="language-bash">sort system.log | uniq -c

# Salida
2 2024-04-25 INFO User logged in successfully.
1 2024-04-25 WARNING Disk usage exceeds 90%.
2 2024-04-26 ERROR Connection timed out.
1 2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Ordena las entradas de log y luego cuenta cada línea única. Según la salida, la línea <code>'2024-04-25 INFO User logged in successfully.'</code> apareció 2 veces en el archivo.</p><p><strong>4. &nbsp;Identificar entradas de log únicas</strong>:</p><pre><code class="language-bash">sort system.log | uniq -u

# Salida

2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Este comando muestra las líneas que son únicas.</p><p><strong>5. &nbsp;Ordenar por nivel de by log level</strong>:</p><pre><code class="language-bash">sort -k2 system.log

# Salida
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-25 WARNING Disk usage exceeds 90%.
</code></pre><p>Ordena las entradas basado en el segundo campo, el cual es el nivel de registro.</p><!--kg-card-begin: html--><h3 id="gestionando-procesos-de-linux">8.4. Gestionando procesos de Linux a través de la Línea de Comandos</h3><!--kg-card-end: html--><p>Un proceso es una instancia de un programa en ejecución. Un proceso consiste de:</p><ul><li>Un espacio de dirección de la memora alojada.</li><li>Estado del Proceso.</li><li>Propiedades tales como propiedad, atributos de seguridad, y uso de recursos.</li></ul><p>Un proceso también tiene un entorno que consiste de:</p><ul><li>Variables locales y globales</li><li>El contexto de programación actual</li><li>Recursos de sistema alojados, tales como puertos de red o descriptores de archivo.</li></ul><p>Cuando ejecutes el comando <code>ls -l</code>, el sistema operativo crea un nuevo proceso para ejecutar el comando. El proceso tiene un ID, un estado, y ejecuta hasta que el comando se complete.</p><h4 id="entendiendo-la-creaci-n-de-procesos-y-el-ciclo-de-vida">Entendiendo la creación de procesos y el ciclo de vida</h4><p>En Ubuntu, todos los procesos se originan desde el proceso del sistema inicial llamado <code>systemd</code>, el cual el primer proceso comenzó por el kernel durante el arrnque.</p><p>El proceso <code>systemd</code> tiene un ID de proceso (PID) de <code>1</code> y es responsable por inicializar el sistema, comenzar y gestionar otros procesos, y manejar servicios de sistema. Todos los otros procesos en el sistema son descendientes de <code>systemd</code>.</p><p>Un proceso padre duplica su propio espacio de dirección (fork) para crear una nueva estructura de proceso. Cada nuevo proceso se le asigna un ID de proceso único (PID) para rastrear y por propósitos de seguridad. El PID y el ID del proceso del padre (PPID) son parte del nuevo entorno del proceso. Cualquier proceso puede crear un proceso hijo.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719584071059/f24fac4b-18f3-4a39-8659-93d32c533256.png" class="kg-image" alt="Process and its initialization to parent and child" width="473" height="649" loading="lazy"></figure><p>A través de la rutina de fork, un proceso hijo hereda identidades de seguridad, descriptores de archivo previos y actuales, puertos y privilegios de recursos, variables de entorno, y código de programa. Un proceso hijo podría ejecutar su propio código de programa.</p><p>Típicamente, un proceso padre se duerme mientras el proceso hijo se ejecuta, estableciendo una petición (wait) para ser notificado cuando el hijo se completa.</p><p>Al salir, el proceso hijo ya se cerrado o descartado sus recursos y entorno. El único recurso que permanece, conocido como un zombie, es una entrada en la table del proceso. El padre, señalado como despierto cuando el hijo termina, limpia la tabla del proceso de la entrada del hijo, de esa forma liberando el último recurso del proceso hijo. El proceso padre luego continua ejecutando su propio código de programa.</p><h4 id="entendiendo-los-estados-del-proceso">Entendiendo los estados del proceso</h4><p>Los procesos en Linux asumen distintos estados durante sus ciclos de vida. El estado de un proceso indica que está haciendo actualmente el proceso y cómo interactúan con el sistema. La transición de procesos entre estados basados en su estado de ejecución y el algoritmo de programación del sistema.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719584116150/3054dfe2-c42c-4d62-9e12-e3aec479d53a.png" class="kg-image" alt="Linux process states and transitions" width="1079" height="742" loading="lazy"></figure><p>Los procesos en un sistema Linux puede ser uno de los siguientes estados:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>Estado</strong></th>
<th><strong>Descripción</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>(new)</strong></td>
<td>El estado inicial cuando un proceso es creado por medio de una llamada del sistema fork.</td>
</tr>
<tr>
<td><strong>Runnable (ready) (R)</strong></td>
<td>El proceso está listo para ejecutarse y esperando a ser programado en una CPU.</td>
</tr>
<tr>
<td><strong>Running (user) (R)</strong></td>
<td>El proceso se ejecuta en modo usuario, ejecutando aplicaciones de usuario.</td>
</tr>
<tr>
<td><strong>Running (kernel) (R)</strong></td>
<td>El proceso se ejecuta en modo kernel, manejando las llamadas de sistema o interrupciones de hardware.</td>
</tr>
<tr>
<td><strong>Sleeping (S)</strong></td>
<td>El proceso está esperando un evento (por ejemplo, operaciones I/O) para completar y puede ser fácilmente despertado.</td>
</tr>
<tr>
<td><strong>Sleeping (uninterruptible) (D)</strong></td>
<td>El proceso está en un estado de sueño ininterruptible, esperando una condición específica (usualmente I/O) que se complete, y no puede ser interrumpido por señales.</td>
</tr>
<tr>
<td><strong>Sleeping (disk sleep) (K)</strong></td>
<td>El proceso está esperando que las operaciones I/O de disco se completen.</td>
</tr>
<tr>
<td><strong>Sleeping (idle) (I)</strong></td>
<td>El proceso está inactivo, no haciendo ningún trabajo, y esperando que un evento ocurra.</td>
</tr>
<tr>
<td><strong>Stopped (T)</strong></td>
<td>La ejecución del proceso ha sido detenido, típicamente por una señal, y puede ser reanudado luego.</td>
</tr>
<tr>
<td><strong>Zombie (Z)</strong></td>
<td>El proceso tiene la ejecución completada pero todavía tiene una entrada en la tabla del proceso, esperando que su antecesor lea su estado de salida.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>La transición de los procesos entre estos estados de las siguientes formas:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>Transición</strong></th>
<th><strong>Descripción</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Fork</strong></td>
<td>Crea un nuevo proceso desde un proceso antecesor, transicionando de (new) a Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Schedule</strong></td>
<td>El scheduler selecciona un proceso ejecutable, transicionándolo del estado Running (user) o Running (kernel).</td>
</tr>
<tr>
<td><strong>Run</strong></td>
<td>Las transiciones de proceso desde Runnable (ready) (R) a Running (kernel) (R) cuando se programa para ejecución.</td>
</tr>
<tr>
<td><strong>Preempt or Reschedule</strong></td>
<td>El proceso puede ser preempted o reprogramado, moviéndolo nuevamente al estado Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Syscall</strong></td>
<td>El proceso hace una llamada de sistema, transicionando de Running (user) (R) a Running (kernel) (R).</td>
</tr>
<tr>
<td><strong>Return</strong></td>
<td>El proceso completa una llamada de sistema y regresa a Running (user) (R).</td>
</tr>
<tr>
<td><strong>Wait</strong></td>
<td>El proceso espera un evento, transicionando de Running (kernel) (R) a uno de los estados de sueño (S, D, K, or I).</td>
</tr>
<tr>
<td><strong>Event o Signal</strong></td>
<td>El proceso se despierta por un evento o señal, cambiándolo de un estado de sueño devuelta a Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Suspend</strong></td>
<td>Process is suspended, transitioning from Running (kernel) or Runnable (ready) to Stopped (T).</td>
</tr>
<tr>
<td><strong>Resume</strong></td>
<td>El proceso se reanuda, cambiando de Stopped (T) devuelta a Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Exit</strong></td>
<td>El proceso termina, transicionando de Running (user) o Running (kernel) a Zombie (Z).</td>
</tr>
<tr>
<td><strong>Reap</strong></td>
<td>El proceso antecesor lee el estado de salida del proceso zombie, quitándolo de la tabla de proceso.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h4 id="c-mo-ver-los-procesos">Cómo ver los procesos</h4><p>Puedes usar el comando <code>ps</code> juntamente con una combinación de opciones para ver los procesos en un sistema Linux. El comando <code>ps</code> se usado para mostrar información sobre una selección de procesos activos. Por ejemplo, <code>ps aux</code> muestra todos los procesos que se ejecutan en el sistema.</p><pre><code class="language-bash">zaira@zaira:~$ ps aux
# Salida
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 168140 11352 ?        Ss   May21   0:18 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    May21   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [netns]
root          11  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [mm_percpu_wq]
root          12  0.0  0.0      0     0 ?        I    May21   0:00 [rcu_tasks_kthread]
root          13  0.0  0.0      0     0 ?        I    May21   0:00 [rcu_tasks_rude_kthread]
*... output truncated ....*
</code></pre><p>La salida de arriba muestra un instantáneo de los procesos actuales en ejecución del sistema. Cada fila representa un proceso con las siguientes columnas:</p><ol><li><code>USER</code>: El usuario quien posee el proceso.</li><li><code>PID</code>: El ID del proceso.</li><li><code>%CPU</code>: El uso del CPU del proceso.</li><li><code>%MEM</code>: El uso de memoria del proceso.</li><li><code>VSZ</code>: El tamaño de la memoria virtual del proceso.</li><li><code>RSS</code>: El tamaño del conjunto residente, que es la memoria física no intercambiada que una tarea ha usado.</li><li><code>TTY</code>: La terminal de control del proceso. Un <code>?</code> indica una terminal de sin control.</li><li><code>STAT</code>: El estado del proceso.</li></ol><ul><li><code>R</code>: Running (ejecutando)</li><li><code>I</code> o <code>S</code>: Sueño interrumpible (esperando que un evento se complete)</li><li><code>D</code>: Sueño ininterrumpible (usualmente IO)</li><li><code>T</code>: Detenido (sea por una señal de control de un trabajo o porque está siendo trazado)</li><li><code>Z</code>: Zombie (terminado pero no repetido por su padre)</li><li><code>Ss</code>: Líder de sesión. Este es un proceso que ha comenzado una sesión, y es un líder de un grupo de procesos y puede controlar señales de la terminal. El primer <code>S</code> indica el estado de dormir, y el segundo <code>s</code> indica que es un líder de sesión.</li></ul><ol><li><code>START</code>: El tiempo de comienzo o fecha del proceso.</li><li><code>TIME</code>: El tiempo de CPU acumulativo.</li><li><code>COMMAND</code>: El comando que comenzó el proceso.</li></ol><h4 id="procesos-de-segundo-y-primer-plano">Procesos de segundo y primer plano</h4><p>En esta sección, aprenderás cómo puedes controlar trabajas al ejecutarlos en segundo o primer plano.</p><p>Un trabajo (job) es un proceso que comienza por una shell. Cuando ejecutas un comando en la terminal, se considera un trabajo. Un trabajo puede ejecutarse en primer o segundo plano.</p><p>Para demostrar el control, primero crearás 3 procesos y luego los ejecutarás en segundo plano. Después de eso, listarás los procesos y los alternarás entre primer y segundo plano. Verás cómo se los pone a dormir o salir completamente.</p><ol><li>Crea tres procesos</li></ol><p>Abre una terminal y comienza tres procesos de larga duración. usa el comando <code>sleep</code>, que mantiene el proceso ejecutándose por un número especificado de segundos.</p><pre><code class="language-bash"># ejecuta el comando sleep por 300, 400, y 500 segundos
sleep 300 &amp;
sleep 400 &amp;
sleep 500 &amp;
</code></pre><p>El <code>&amp;</code> al final de cada comando mueve el proceso a segundo plano.</p><p>2. &nbsp; Muestra trabajos en segundo plano</p><p>Usa el comando <code>jobs</code> para mostrar la lista de trabajos en segundo plano.</p><pre><code class="language-bash">jobs
</code></pre><p>La salida debería verse así:</p><pre><code class="language-bash">jobs
[1]   Running                 sleep 300 &amp;
[2]-  Running                 sleep 400 &amp;
[3]+  Running                 sleep 500 &amp;
</code></pre><p>3. &nbsp; Traer un trabajo en segundo plano a primer plano</p><p>Para traer un trabajo en segundo plano al primer plano, usa el comando <code>fg</code> seguido del número del trabajo. Por ejemplo, para traer el primer trabajo (<code>sleep 300</code>) al primer plano:</p><pre><code class="language-bash">fg %1
</code></pre><p>Esto traerá el trabajo <code>1</code> al primer plano.</p><p>4. &nbsp; Mueve el trabajo en primero plano nuevamente a segundo plano</p><p>Mientras el trabajo se ejecuta en el primer plano, puedes suspenderlo y llevarlo nuevamente al segundo plano al presionar <code>Ctrl+Z</code> para suspender el trabajo.</p><p>Un trabajo suspendido se verás de esta forma:</p><pre><code class="language-bash">zaira@zaira:~$ fg %1
sleep 300

^Z
[1]+  Stopped                 sleep 300

zaira@zaira:~$ jobs
# trabajo suspendido 
[1]+  Stopped                 sleep 300
[2]   Running                 sleep 400 &amp;
[3]-  Running                 sleep 500 &amp;
</code></pre><p>Ahora usa el comando <code>bg</code> para reanudar el trabajo con ID 1 en el segundo plano.</p><pre><code class="language-bash"># Presiona Ctrl+Z para suspender el trabajo de primer plano
# Luego, reanúdalo en segundo plano
bg %1
</code></pre><ol><li>Muestra los trabajos nuevamente</li></ol><pre><code class="language-bash">jobs
[1]   Running                 sleep 300 &amp;
[2]-  Running                 sleep 400 &amp;
[3]+  Running                 sleep 500 &amp;
</code></pre><p>En este ejercicio, vos:</p><ul><li>Comenzaste tres proceso en segundo plano usando comandos sleep.</li><li>Usaste trabajos para mostrar la lista de trabajos en segundo plano.</li><li>Trajiste un trabajo a primer plano con <code>fg %job_number</code>.</li><li>Suspendiste el trabajo con <code>Ctrl+Z</code> y lo regresaste al segundo plano con <code>bg %job_number</code>.</li><li>Usaste los trabajos nuevamente para verificar el estado de los trabajos en segundo plano.</li></ul><p>Ahora sanes cómo controlar los trabajos.</p><h4 id="matando-procesos">Matando procesos</h4><p>Es posible terminar un proceso que no responde o no querido usando el comando <code>kill</code>. El comando <code>kill</code> envía una señal a un ID de proceso, pidiéndole que termine.</p><p>Un número de opciones están disponibles con el comando <code>kill</code>.</p><pre><code class="language-bash"># Opciones disponibles con kill

kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) 
...terminated
</code></pre><p>Aquí hay algunos ejemplos del comando <code>kill</code> en Linux:</p><p><strong>Matar un proceso por PID (ID del proceso):</strong></p><pre><code class="language-bash"> kill 1234
</code></pre><p>Este comando envía la señal <code>SIGTERM</code> predeterminada al proceso con un PID de 1234, solicitándole que termine.</p><p><strong>Matar un proceso por nombre:</strong></p><pre><code class="language-bash"> pkill process_name
</code></pre><p>Este comando envía la señal <code>SIGTERM</code> predeterminada a todos los procesos con el nombre especificado.</p><p><strong>Matar un proceso a la fuerza:</strong></p><pre><code class="language-bash"> kill -9 1234
</code></pre><p>Este comando envía la señal <code>SIGKILL</code> al proceso con el PID 1234, terminándolo a la fuerza.</p><p><strong>Envía una señal específica a un proceso:</strong></p><pre><code class="language-bash"> kill -s SIGSTOP 1234
</code></pre><p>Este comando envía la señal <code>SIGSTOP</code> al proceso con el PID 1234, deteniéndolo.</p><p><strong>Matar a todos los procesos que pertenecen a un usuario específico:</strong></p><pre><code class="language-bash"> pkill -u username
</code></pre><p>Este comando envía la señal <code>SIGTERM</code> predeterminada a todos los procesos que pertenecen al usuario especificado.</p><p>Estos ejemplos demuestran varias formas de usar el comando <code>kill</code> para gestionar procesos en un entorno de Linux.</p><p>Aquí esta la información sobre las opciones &nbsp;y señales del comando <code>kill</code> de una forma tabular: Esta tabla resumen las opciones y señales más comunes del comando <code>kill</code> usados para gestionar los procesos.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Comando / Opción</th>
<th>Señal</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>kill &lt;pid&gt;</code></td>
<td><code>SIGTERM</code></td>
<td>Solicita al proceso que termina correctamente (señal predeterminada).</td>
</tr>
<tr>
<td><code>kill -9 &lt;pid&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza al proceso que termine inmediatamente sin limpiar.</td>
</tr>
<tr>
<td><code>kill -SIGKILL &lt;pid&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza al proceso que termine inmediatamente sin limpiar.</td>
</tr>
<tr>
<td><code>kill -15 &lt;pid&gt;</code></td>
<td><code>SIGTERM</code></td>
<td>Envía explícitamente la señal <code>SIGTERM</code> para solicitar la terminación correcta.</td>
</tr>
<tr>
<td><code>kill -SIGTERM &lt;pid&gt;</code></td>
<td><code>SIGTERM</code></td>
<td>Envía explícitamente la señal <code>SIGTERM</code> para solicitar la terminación correcta.</td>
</tr>
<tr>
<td><code>kill -1 &lt;pid&gt;</code></td>
<td><code>SIGHUP</code></td>
<td>Tradicionalmente significa "colgarse"; puede ser usado para recargar archivos de configuración.</td>
</tr>
<tr>
<td><code>kill -SIGHUP &lt;pid&gt;</code></td>
<td><code>SIGHUP</code></td>
<td>Tradicionalmente significa "colgarse"; puede ser usado para recargar archivos de configuración.</td>
</tr>
<tr>
<td><code>kill -2 &lt;pid&gt;</code></td>
<td><code>SIGINT</code></td>
<td>Solicita al proceso que termine (lo mismo que presionar <code>Ctrl+C</code> en la terminal).</td>
</tr>
<tr>
<td><code>kill -SIGINT &lt;pid&gt;</code></td>
<td><code>SIGINT</code></td>
<td>Solicita al proceso que termine (lo mismo que presione <code>Ctrl+C</code> en la terminal).</td>
</tr>
<tr>
<td><code>kill -3 &lt;pid&gt;</code></td>
<td><code>SIGQUIT</code></td>
<td>Hace que el proceso termine y produzca un core dump para depuración.</td>
</tr>
<tr>
<td><code>kill -SIGQUIT &lt;pid&gt;</code></td>
<td><code>SIGQUIT</code></td>
<td>Hace que el proceso termine y produzca un core dump para depuración.</td>
</tr>
<tr>
<td><code>kill -19 &lt;pid&gt;</code></td>
<td><code>SIGSTOP</code></td>
<td>Pausa el proceso.</td>
</tr>
<tr>
<td><code>kill -SIGSTOP &lt;pid&gt;</code></td>
<td><code>SIGSTOP</code></td>
<td>Pausa el proceso.</td>
</tr>
<tr>
<td><code>kill -18 &lt;pid&gt;</code></td>
<td><code>SIGCONT</code></td>
<td>Reanuda un proceso pausado.</td>
</tr>
<tr>
<td><code>kill -SIGCONT &lt;pid&gt;</code></td>
<td><code>SIGCONT</code></td>
<td>Reanuda un proceso pausado.</td>
</tr>
<tr>
<td><code>killall &lt;nombre&gt;</code></td>
<td>Varios</td>
<td>Envía una señal a todos los procesos con el nombre provisto.</td>
</tr>
<tr>
<td><code>killall -9 &lt;nombre&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza que mate a todos los procesos con el nombre provisto.</td>
</tr>
<tr>
<td><code>pkill &lt;patron&gt;</code></td>
<td>Varios</td>
<td>Envía una señal a los procesos basado en una coincidencia de patrón.</td>
</tr>
<tr>
<td><code>pkill -9 &lt;patron&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza que mate a todos los procesos que coincida con el patrón.</td>
</tr>
<tr>
<td><code>xkill</code></td>
<td><code>SIGKILL</code></td>
<td>Utilidad gráfica que permite hacer clic en una ventana para que mate al proceso correspondiente.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="flujos-entrada-y-salida-estandar-en-linux">8.5. Flujos de Entrada y Salida Estándar en Linux</h3><!--kg-card-end: html--><p>Leer una entrada y escribir una entrada es una parte esencial de entender la línea de comandos y la programación de scripts. En Linux, cada proceso tiene tres flujos predeterminados:</p><p>Entrada Estándar (<code>stdin</code>): Este flujo se usa para entradas, típicamente desde el teclado. Cuando un programa lee desde el <code>stdin</code>, recibe datos ingresados por el usuario o redireccionado desde un archivo. Un descriptor de archivo es un identificador único que el sistema operativo asigna a un archivo abierto para mantener un rastro de archivos abiertos.</p><p>El descriptor de archivo para <code>stdin</code> es <code>0</code>.</p><p>Salida Estándar (<code>stdout</code>): Este es el flujo de salida predeterminado donde un proceso escribe su salida. Por defecto, la salida estándar es la terminal. La salida también puede ser redireccionado a un archivo u otro programa. El descriptor de archivo para <code>stdout</code> es <code>1</code>.</p><p>Error Estándar (<code>stderr</code>): Este es el flujo de error estándar donde un proceso escribe sus mensajes de error. Por defecto, el error estándar es la terminal, permitiendo que los mensajes de error sea visto inclusive si <code>stdout</code> es redireccionado. El descriptor de archivo para <code>stderr</code> es <code>2</code>.</p><h4 id="redirecci-n-y-tuber-as">Redirección y Tuberías</h4><p><strong>Redirección:</strong> Puedes redireccionar el error y los flujos de salida a los archivos u otros comandos. Por ejemplo:</p><pre><code class="language-bash"># Redireccionando stdout a un archivo
ls &gt; output.txt

# Redireccionando stderr a un archivo
ls non_existent_directory 2&gt; error.txt

# Redireccionando stdout y stderr a un archivo
ls non_existent_directory &gt; all_output.txt 2&gt;&amp;1
</code></pre><p>En el último comando,</p><ul><li><code>ls non_existent_directory</code>: lista los contenidos de una carpeta llamada non_existent_directory. Ya que esta carpeta no existe, <code>ls</code> generará un mensaje de error.</li><li><code>&gt; all_output.txt</code>: El operador <code>&gt;</code> redirecciona la salida estándar (<code>stdout</code>) del comando <code>ls</code> al archivo <code>all_output.txt</code>. Si el archivo no existe, será creado. Si existe, su contenido será sobrescrito.</li><li><code>2&gt;&amp;1:</code>: Aquí, <code>2</code> representa el descriptor del archivo para el error estándar (<code>stderr</code>). <code>&amp;1</code> representa el descriptor del archivo para la salida estándar (<code>stdout</code>). El caracter <code>&amp;</code> se usa para especificar que <code>1</code> no es el nombre del archivo sino un descriptor del archivo.</li></ul><p>Así que, <code>2&gt;&amp;1</code> significa "redirecciona stderr (2) a donde sea que stdout (1) esté yendo actualmente", el cual en este caso es el archivo <code>all_output.txt</code>. Por lo tanto, la salida (si hay uno) y el mensaje de error de <code>ls</code> será escrito a <code>all_output.txt</code>.</p><p><strong>Tuberías:</strong></p><p>Puedes usar tuberías (<code>|</code>) para pasar la salida de un comando como la entrada a otro:</p><pre><code class="language-bash">ls | grep image
# Salida
image-10.png
image-11.png
image-12.png
image-13.png
... Output truncated ...
</code></pre><!--kg-card-begin: html--><h3 id="automatizacion-linux-automatizar-tareas-cron-jobs">8.6 Automatización en Linux – Automatizar Tareas con Tareas de Cron</h3><!--kg-card-end: html--><p>Cron es una utilidad poderosa para programar trabajos que está disponible en sistemas operativos de Unix. Al configurar un cron, puedes configurar trabajos automatizados para ejecutar diariamente, mensualmente, u otro tiempo específico. Las capacidades de automatización provisto por cron juega un rol crucial en la administración de sistema de Linux.</p><p>El <a href="https://es.wikipedia.org/wiki/Daemon_(inform%C3%A1tica)">daemon</a> <code>crond</code> (un tipo de programa de computadora que se ejecuta en segundo plano) permite la funcionalidad de cron. El cron lee el <strong>crontab</strong> (tablas de cron) para ejecutar scripts predefinidos.</p><p>Al usar una sintaxis específica, puedes configurar un trabajo cron para programar scripts u otros comandos para ejecutarlos automáticamente.</p><p><strong>¿Qué son los trabajos cron en Linux?</strong></p><p>Cualquier tarea que programes a través de crons se llama un trabajo de cron.</p><p>Ahora, veamos cómo los trabajos de cron funcionan.</p><h4 id="c-mo-controlar-el-acceso-a-los-crons">Cómo controlar el acceso a los crons</h4><p>Para usar los trabajos de cron, un administrador necesita permitir a los trabajos de cron que sean agregados para los usuarios en el archivo <code>/etc/cron.allow</code>.</p><p>Si obtienes un mensaje como este, significa que no tienes permiso para usar cron.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-51.png" class="kg-image" alt="Cron job addition denied for user John." width="600" height="400" loading="lazy"></figure><p>Para permitir a John que use crons, incluye su nombre en <code>/etc/cron.allow</code>. Crea el archivo si no existe. Esto permitirá a John que cree y edite trabajos de cron.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-52.png" class="kg-image" alt="Allowing John in file cron.allow" width="600" height="400" loading="lazy"></figure><p>Los usuarios también se les puede denegar el acceso a trabajos de cron al ingresar sus nombres de usuario en el archivo <code>/etc/cron.d/cron.deny</code>.</p><h4 id="c-mo-agrega-trabajos-de-cron-en-linux">Cómo agrega trabajos de cron en Linux</h4><p>Primero, para usar los trabajos de cron, necesitarás verificar el estado del servicio de cron. Si cron no está instalado, puedes descargarlo fácilmente a través del gestor de paquetes. Solo usa esto para verificar:</p><pre><code class="language-bash"># Check cron service on Linux system
sudo systemctl status cron.service
</code></pre><h4 id="sintaxis-de-trabajos-de-cron">Sintaxis de trabajos de Cron</h4><p>Los crontabs usan los siguientes argumentos para agregar y listar trabajos de cron:</p><ul><li><code>crontab -e</code>: edita las entradas de crontab para agregar, eliminar, o editar trabajos de cron.</li><li><code>crontab -l</code>: listar todos los trabajos de cron para el usuario actual.</li><li><code>crontab -u nombre-usuario -l</code>: lista los crons de otro usuario.</li><li><code>crontab -u nombre-usuario -e</code>: edita los crons de otro usuario.</li></ul><p>Cuando listas los crons y existen, verás algo como esto:</p><pre><code class="language-bash"># Cron job example
* * * * * sh /path/to/script.sh
</code></pre><p>En el ejemplo de arriba,</p><ul><li><code>*</code> representa minuto(s) hora(s) día(s) mes(es) semana(s), respectivamente. Ve los detalles de estos valores abajo:</li></ul><!--kg-card-begin: html--><table>
<thead>
<tr>
<th></th>
<th><strong>VALOR</strong></th>
<th><strong>DESCRIPCIÓN</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Minutos</td>
<td>0-59</td>
<td>El comando será ejecutado en el minuto específico.</td>
</tr>
<tr>
<td>Horas</td>
<td>0-23</td>
<td>El comando será ejecutado en la hora específica.</td>
</tr>
<tr>
<td>Días</td>
<td>1-31</td>
<td>Los comandos serán ejecutados en estos días de los meses.</td>
</tr>
<tr>
<td>Meses</td>
<td>1-12</td>
<td>El mes en el que las tareas necesitan ser ejecutados.</td>
</tr>
<tr>
<td>Días de la semana</td>
<td>0-6</td>
<td>Días de la semana donde los comandos se ejecutarán. Aquí, 0 es Domingo.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><ul><li><code>sh</code> representa que el script es un script de bash y debería ser ejecutado desde <code>/bin/bash</code>.</li><li><code>/path/to/script.sh</code> especifica la ruta al script.</li></ul><p>Abajo hay un resumen de la sintaxis de los trabajos de cron:</p><pre><code class="language-markdown">*   *   *   *   *  sh /path/to/script/script.sh
|   |   |   |   |              |
|   |   |   |   |      Comando o Script a ejecutarse        
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   | Día de la Semana(0-6)
|   |   |   |
|   |   | Mes del Año(1-12)
|   |   |
|   | Día del Mes(1-31)  
|   |
| Hora(0-23)  
|
Min(0-59)
</code></pre><h4 id="ejemplos-de-trabajos-de-cron">Ejemplos de Trabajos de Cron</h4><p>Abajo hay algunos ejemplos de programación de trabajos de cron.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>PROGRAMACIÓN</strong></th>
<th><strong>VALOR DE LA PROGRAMACIÓN</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>5 0 * 8 *</code></td>
<td>A las 00:05 en Agosto.</td>
</tr>
<tr>
<td><code>5 4 * * 6</code></td>
<td>A las 04:05 el Sábado.</td>
</tr>
<tr>
<td><code>0 22 * * 1-5</code></td>
<td>A las 22:00 cada día de la semana desde Lunes hasta Viernes.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>No hay problema si no logras comprender todo esto de una vez. Puedes practicar y generar cronogramas con el sitio web <a href="https://crontab.guru/">crontab guru</a>.</p><h4 id="c-mo-configurar-un-trabajo-cron">Cómo configurar un trabajo cron</h4><p>En esta sección, veremos un ejemplo de cómo programar un script sencillo con un trabajo cron.</p><ol><li>Crea un script llamado <code>date-script.sh</code> el cual imprime la fecha y hora del sistema y lo adjunta a un archivo. El script se muestra abajo:</li></ol><pre><code class="language-bash">#!/bin/bash

echo `date` &gt;&gt; date-out.txt
</code></pre><p>2. &nbsp; Haz que el script sea ejecutable al darle derechos de ejecución.</p><pre><code class="language-bash">chmod 775 date-script.sh
</code></pre><p>3. &nbsp; Agrega el script en el crontab usando <code>crontab -e</code>.</p><p>Aquí, lo hemos programado para que se ejecute por minuto.</p><pre><code class="language-bash">*/1 * * * * /bin/sh /root/date-script.sh
</code></pre><p>4. &nbsp; Verifica la salida del archivo <code>date-out.txt</code>. Según el script, la fecha del sistema debería ser impreso a este archivo cada minuto.</p><pre><code class="language-bash">cat date-out.txt
# Salida
Wed 26 Jun 16:59:33 PKT 2024
Wed 26 Jun 17:00:01 PKT 2024
Wed 26 Jun 17:01:01 PKT 2024
Wed 26 Jun 17:02:01 PKT 2024
Wed 26 Jun 17:03:01 PKT 2024
Wed 26 Jun 17:04:01 PKT 2024
Wed 26 Jun 17:05:01 PKT 2024
Wed 26 Jun 17:06:01 PKT 2024
Wed 26 Jun 17:07:01 PKT 2024
</code></pre><p><strong>Cómo solucionar problemas de crons</strong></p><p>Los crons son realmente útiles, pero no podrían funcionar siempre como se espera. Afortunadamente, hay algunos métodos efectivos que puedes usar para solucionar problemas.</p><p><strong>1. Verifica la programación.</strong></p><p>Primero, puedes intentar verificar la programación que fue hecho para el cron. Puedes hacer eso con la sintaxis que viste en las secciones de arriba.</p><p><strong>2</strong>. <strong>Verificar archivos log de cron.</strong></p><p>Primero, necesita verificar si el con se ha ejecutado en el tiempo previsto o no. En Ubuntu, puedes verificarlo desde los logs de cron localizado en <code>/var/log/syslog</code>.</p><p>Si hay una entrada en estos logs en el tiempo correcto, significa que el cron se ha ejecutado según la planificación que estableciste.</p><p>Abajo están los logs de nuestro ejemplo de un trabajo de cron. Fíjate que la primer columna el cual muestra la marca de tiempo. La ruta del script también se menciona al final de la línea. Línea #1, 3, y 5 muestra que el script se ejecutó como se esperaba.</p><pre><code class="language-bash">1 Jun 26 17:02:01 zaira-ThinkPad CRON[27834]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
2 Jun 26 17:02:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
3 Jun 26 17:03:01 zaira-ThinkPad CRON[28255]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
4 Jun 26 17:03:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
5 Jun 26 17:04:01 zaira-ThinkPad CRON[28538]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
</code></pre><p><strong>3. Redireccionar la salida del cron a un archivo.</strong></p><p>Puedes redireccionar una salida del cron a un archivo y verificar si el archivo tiene algún error posible.</p><pre><code class="language-bash"># Redirige la salida de cron a un archivo
* * * * * sh /path/to/script.sh &amp;&gt; log_file.log
</code></pre><!--kg-card-begin: html--><h3 id="conceptos-basicos-de-redes-de-linux">8.7. Conceptos Básicos de Redes de Linux</h3><!--kg-card-end: html--><p>Linux ofrece un número de comandos para ver la información relacionado a la red. En esta sección discutiremos brevemente algunos de los comandos.</p><h4 id="ver-interfaces-de-red-con-ifconfig">Ver interfaces de red con <code>ifconfig</code></h4><p>El comando <code>ifconfig</code> provee información sobre las interfaces de red. Aquí hay un ejemplo de salida:</p><pre><code class="language-bash">ifconfig

# Salida
eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe4e:66a1  prefixlen 64  scopeid 0x20&lt;link&gt;
        ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)
        RX packets 1024  bytes 654321 (654.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 512  bytes 123456 (123.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10&lt;host&gt;
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 256  bytes 20480 (20.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 256  bytes 20480 (20.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
</code></pre><p>La salida del comando <code>ifconfig</code> muestra las interfaces de red configurados en el sistema, juntamente con detalles tales como direcciones IP, direcciones MAC, estadísticas de paquetes, y más.</p><p>Estas interfaces pueden ser dispositivos físicos o virtuales.</p><p>Para extraer las direcciones IPv4 y IPv6, puedes usar <code>ip -4 addr</code> y <code>ip -6 addr</code>, respectivamente.</p><p><strong>Ver la actividad de red con</strong> <code>netstat</code></p><p>El comando <code>netstat</code> muestra las estadísticas y la actividad de la red al dar la siguiente información:</p><p>Aquí hay algunos ejemplos al usar el comando <code>netstat</code> en la línea de comandos:</p><p><strong>Muestra todos los sockets de escucha y no escucha:</strong></p><pre><code class="language-bash"> netstat -a
</code></pre><p><strong>Muestra solamente los puertos en escucha:</strong></p><pre><code class="language-bash"> netstat -l
</code></pre><p><strong>Muestra las estadísticas de red:</strong></p><pre><code class="language-bash"> netstat -s
</code></pre><p><strong>Muestra la tabla de enrutamiento:</strong></p><pre><code class="language-bash"> netstat -r
</code></pre><p><strong>Muestra las conexiones TCP:</strong></p><pre><code class="language-bash"> netstat -t
</code></pre><p><strong>Muestra las conexiones UDP:</strong></p><pre><code class="language-bash"> netstat -u
</code></pre><p><strong>Muestra las interfaces de red:</strong></p><pre><code class="language-bash"> netstat -i
</code></pre><p><strong>Muestra el PID y los nombres de programa para las conexiones:</strong></p><pre><code class="language-bash"> netstat -p
</code></pre><p><strong>Muestra las estadísticas para un protocolo específico (por ejemplo, TCP):</strong></p><pre><code class="language-bash"> netstat -st
</code></pre><p><strong>Mostrar información extendida:</strong></p><pre><code class="language-bash">netstat -e
</code></pre><h4 id="verifica-la-conectividad-de-red-entre-dos-dispositivos-usando-ping">Verifica la conectividad de red entre dos dispositivos usando <code>ping</code></h4><p><code>ping</code> se usa para probar la conectividad de red entre dos dispositivos. Envía paquetes ICMP al dispositivo objetivo y espera una respuesta.</p><pre><code class="language-bash">ping google.com
</code></pre><p><code>ping</code> prueba si obtienes una respuesta sin recibir un tiempo de espera.</p><pre><code class="language-bash">ping google.com
PING google.com (142.250.181.46) 56(84) bytes of data.
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=1 ttl=60 time=78.3 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=2 ttl=60 time=141 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=3 ttl=60 time=205 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=4 ttl=60 time=100 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 78.308/131.053/204.783/48.152 ms
</code></pre><p>Puedes detener la respuesta con <code>Ctrl + C</code>.</p><h4 id="probando-recursos-con-el-comando-curl">Probando recursos con el comando <code>curl</code></h4><p>El comando <code>curl</code> significa "URL del cliente". Se usa para transferir datos a un o de un servidor. También puede ser usado para probar recursos de una API lo que ayuda en solucionar errores de sistema y de aplicaciones.</p><p>Como un ejemplo, puedes usar <a href="http://www.official-joke-api.appspot.com/"><code>http://www.official-joke-api.appspot.com/</code></a> para experimentar con el comando <code>curl</code>.</p><ul><li>El comando <code>curl</code> sin ninguna opción usa el método GET por defecto.</li></ul><pre><code class="language-bash">curl http://www.official-joke-api.appspot.com/random_joke
{"type":"general",
"setup":"What did the fish say when it hit the wall?","punchline":"Dam.","id":1}
</code></pre><ul><li><code>curl -o</code> guarda la salida al archivo mencionado.</li></ul><pre><code class="language-bash">curl -o random_joke.json http://www.official-joke-api.appspot.com/random_joke
# saves the output to random_joke.json
</code></pre><ul><li><code>curl -I</code> busca solamente las cabeceras.</li></ul><pre><code class="language-bash">curl -I http://www.official-joke-api.appspot.com/random_joke
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"71-NaOSpKuq8ChoxdHD24M0lrA+JXA"
X-Cloud-Trace-Context: 2653a86b36b8b131df37716f8b2dd44f
Content-Length: 113
Date: Thu, 06 Jun 2024 10:11:50 GMT
Server: Google Frontend
</code></pre><!--kg-card-begin: html--><h3 id="solucionando-problemas-linux-herramientas-y-tecnicas">8.8. Solucionando problemas de Linux: Herramientas y Técnicas</h3><!--kg-card-end: html--><h4 id="reporte-de-actividad-del-sistema-con-sar">Reporte de actividad del Sistema con <code>sar</code></h4><p>El comando <code>sar</code> en Linux es una herramienta poderosa para recolectar, reportar, y guardar información de estadísticas del sistema. Es parte del paquete <code>sysstat</code> y es ampliamente usado para monitorear el rendimiento del sistema con el tiempo.</p><p>Para usar <code>sar</code> primero necesitas instalar <code>sysstat</code> usando <code>sudo apt install sysstat</code>.</p><p>Una vez instalado, comienza el servicio con <code>sudo systemctl start sysstat</code>.</p><p>Verifica el estado con <code>sudo systemctl status sysstat</code>.</p><p>Una vez que el estado esté activo, el sistema comenzará a recolectar varias estadísticas que puedes usar para acceder y analizar datos históricos. Veremos eso en detalle pronto.</p><p>La sintaxis del comando <code>sar</code> es como sigue:</p><pre><code class="language-bash">sar [opciones] [intervalo] [cuenta]
</code></pre><p>Por ejemplo, <code>sar -u 1 3</code> mostrará el uso de estadísticas del CPU por segundo tres veces.</p><pre><code class="language-bash">sar -u 1 3
# Salida
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:09:26        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:09:27        all      3.78      0.00      2.18      0.08      0.00     93.96
19:09:28        all      4.02      0.00      2.01      0.08      0.00     93.89
19:09:29        all      6.89      0.00      2.10      0.00      0.00     91.01
Average:        all      4.89      0.00      2.10      0.06      0.00     92.95
</code></pre><p>Aquí hay algunos de los casos de uso comunes y ejemplos de cómo usar el comando <code>sar</code>.</p><p><code>sar</code> puede ser usado para una variedad de propósitos:</p><h5 id="1-uso-de-memoria">1. Uso de Memoria</h5><p>Para verificar el uso de memoria (libre y usado), usa:</p><pre><code class="language-bash">sar -r 1 3

Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:10:46    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
19:10:47      4600104   8934352   5502124     36.32    375844   4158352  15532012     65.99   6830564   2481260       264
19:10:48      4644668   8978940   5450252     35.98    375852   4165648  15549184     66.06   6776388   2481284        36
19:10:49      4646548   8980860   5448328     35.97    375860   4165648  15549224     66.06   6774368   2481292       116
Average:      4630440   8964717   5466901     36.09    375852   4163216  15543473     66.04   6793773   2481279       139
</code></pre><p>Este comando muestra las estadísticas de memoria cada segundo tres veces.</p><h5 id="2-utilizaci-n-del-espacio-de-intercambio-swap-">2. Utilización del espacio de intercambio (Swap)</h5><p>Para ver las estadísticas del uso del espacio de swap, usa:</p><pre><code class="language-bash">sar -S 1 3

sar -S 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:11:20    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
19:11:21      8388604         0      0.00         0      0.00
19:11:22      8388604         0      0.00         0      0.00
19:11:23      8388604         0      0.00         0      0.00
Average:      8388604         0      0.00         0      0.00
</code></pre><p>Este comando ayuda en monitorear el uso de swap, lo cual es crucial para los sistemas que quedan sin espacio de memoria física.</p><h5 id="3-carga-de-dispositivos-i-o">3. Carga de dispositivos I/O</h5><p>Para reportar actividad de dispositivos de bloque y particiones de dispositivos de bloque:</p><pre><code class="language-bash">sar -d 1 3
</code></pre><p>Este comando provee estadísticas detallados sobre las transferencias de datos de los dispositivos de bloque, y es útil para diagnosticar cuellos de botella de I/O.</p><h5 id="5-estad-sticas-de-red">5. Estadísticas de Red</h5><p>Para ver las estadísticas de red, como el número de paquetes recibidos (transmitidos) por la interfaz de red:</p><pre><code class="language-bash">sar -n DEV 1 3
# -n DEV le dice a sar que reporte interfaces de dispositivos de red
sar -n DEV 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:12:47        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
19:12:48           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19:12:48       enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19:12:48       wlp3s0     10.00      3.00      1.83      0.37      0.00      0.00      0.00      0.00
19:12:48    br-5129d04f972f      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
.
.
.

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
...output truncated...
</code></pre><p>Esto muestra las estadísticas de red cada segundo por tres segundos, lo que ayuda en monitorear el tráfico de red.</p><h5 id="6-datos-hist-ricos">6. Datos históricos</h5><p>Recuerda que instalamos el paquete <code>sysstat</code> previamente &nbsp;y ejecutamos el servicio. Sigue los pasos de abajo para permitir y acceder a los datos históricos.</p><p><strong>Permitir recolección de datos:</strong> Edita el archivo de configuración <code>sysstat</code> para permitir la recolección de datos.</p><pre><code class="language-bash"> sudo nano /etc/default/sysstat
</code></pre><p>Cambia <code>ENABLED="false"</code> a <code>ENABLED="true"</code>.</p><pre><code class="language-bash"> vim /etc/default/sysstat
 #
 # Configuraciones predeterminadas para los archivos /etc/init.d/sysstat, /etc/cron.d/sysstat
 # y /etc/cron.daily/sysstat
 #

 # ¿Debería sadc recolectar información de la actividad del sistema? Valores válidos
 # son "true" y "false". Por favor no pongas otros valores, serán
 # anulados por debconf!
 ENABLED="true"
</code></pre><p><strong>Configura el intervalo de recolección de datos:</strong> Edita la configuración del trabajo de cron para poner el intervalo de recolección de datos.</p><pre><code class="language-bash"> sudo nano /etc/cron.d/sysstat
</code></pre><p>Por defecto, recolecta datos cada 10 minutos. Puedes ajustar el intervalo al modificar la planificación del trabajo de cron. Los archivos relevantes irán a la carpeta <code>/var/log/sysstat</code>.</p><p><strong>Ver los datos históricos:</strong> Usa el comando <code>sar</code> para ver los datos históricos. Por ejemplo, para ver el uso del CPU para el día actual:</p><pre><code class="language-bash"> sar -u
</code></pre><p>Para ver los datos desde una fecha específica:</p><pre><code class="language-bash"> sar -u -f /var/log/sysstat/sa&lt;DD&gt;
</code></pre><p>Reemplaza <code>&lt;DD&gt;</code> con el día del mes con el cual quieres ver los datos.</p><p>En el comando de abajo, <code>/var/log/sysstat/sa04</code> provee estadísticas para el cuarto día del mes actual.</p><pre><code class="language-bash">sar -u -f /var/log/sysstat/sa04
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

15:20:49     LINUX RESTART    (12 CPU)

16:13:30     LINUX RESTART    (12 CPU)

18:16:00        CPU     %user     %nice   %system   %iowait    %steal     %idle
18:16:01        all      0.25      0.00      0.67      0.08      0.00     99.00
Average:        all      0.25      0.00      0.67      0.08      0.00     99.00
</code></pre><h5 id="7-interrupciones-de-la-cpu-en-tiempo-real">7. Interrupciones de la CPU en tiempo real</h5><p>Para observar interrupciones en tiempo real por segundo servido por la CPU, usa este comando:</p><pre><code class="language-bash">sar -I SUM 1 3

# Salida
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:14:22         INTR    intr/s
19:14:23          sum   5784.00
19:14:24          sum   5694.00
19:14:25          sum   5795.00
Average:          sum   5757.67
</code></pre><p>Este comando ayuda a monitorear con cuanta frecuencia la CPU maneja las interrupciones, lo cual puede ser crucial para ajuste de rendimiento en tiempo real.</p><p>Estos ejemplos ilustran cómo puedes usar <code>sar</code> para monitorear varios aspectos del rendimiento de sistema. El uso regular de <code>sar</code> puede ayudar a identificar los cuellos de botella del sistema y asegurar que las aplicaciones se mantenga ejecutando de forma eficiente.</p><!--kg-card-begin: html--><h3 id="estrategia-general-para-solucionar-problemas-servidores">8.9. Estrategia General para Solucionar Problemas para los Servidores</h3><!--kg-card-end: html--><p><strong>¿Por qué necesitamos entender sobre monitoreo?</strong></p><p>El monitoreo de sistema es un aspecto importante de la administración de sistema. Las aplicaciones críticas demandan un alto nivel de proactividad para prevenir fallas y reducir el impacto de cortes.</p><p>Linux ofrece herramientas muy potentes para medir la salud del sistema. En esta sección, aprenderás sobre los varios métodos disponibles para verificar la salud del sistema e identificar los cuellos de botella.</p><h4 id="encontrar-el-promedio-de-carga-y-tiempo-de-actividad-del-sistema">Encontrar el promedio de carga y tiempo de actividad del sistema</h4><p>Los reinicios de sistema podría ocurrir lo cual puede a veces arruinar algunas configuraciones. Para verificar cuánto tiempo la máquina estuvo activa, usa el comando: <code>uptime</code>. Además del tiempo de actividad, el comando también muestra el promedio de carga.</p><pre><code class="language-bash">[user@host ~]$ uptime 19:15:00 up 1:04, 0 users, load average: 2.92, 4.48, 5.20
</code></pre><p>El promedio de carga es la carga del sistema durante los minutos 1, 5 y 15. Un vistazo rápido indica si la carga de sistema está en incremento o disminuyendo con el tiempo.</p><p>Nota: la cola de CPU ideal es <code>0</code>. Esto es posible solamente cuando no hay colas de espera para la CPU.</p><p>Cada carga de CPU puede ser calculado al dividir el promedio de carga con el número total de CPUs disponibles.</p><p>Para encontrar el número de CPUs, usa el comando <code>lscpu</code>.</p><pre><code class="language-bash">lscpu
# Salida
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
.
.
.
Salida omitido
</code></pre><p>Si el promedio de carga parece incrementar y no se va para abajo, los CPUs están sobrecargados. Hay algún proceso que está estancado o hay fuga de memoria.</p><h4 id="calculando-memoria-libre">Calculando memoria libre</h4><p>A veces, el alto uso de memoria podría causar problemas. Para verificar la memoria disponible y la memoria en uso, usa el comando <code>free</code>.</p><pre><code class="language-bash">free -mh
# Salida
               total        used        free      shared  buff/cache   available
Mem:            14Gi       3.5Gi       7.7Gi       109Mi       3.2Gi        10Gi
Swap:          8.0Gi          0B       8.0Gi
</code></pre><h4 id="calculando-el-espacio-de-disco">Calculando el espacio de disco</h4><p>Para asegurarse que el sistema está saludable, no te olvides sobre el espacio de disco. Para listar todos los puntos de montaje disponible y su porcentaje usado respectivamente, usa el comando de abajo. Idealmente, los espacios de disco utilizados no deberían exceder un 80%.</p><p>El comando <code>df</code> provee espacios de disco detallados.</p><pre><code class="language-bash">df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.5G  2.4M  1.5G   1% /run
/dev/nvme0n1p2  103G   34G   65G  35% /
tmpfs           7.3G   42M  7.2G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
efivarfs        246K   93K  149K  39% /sys/firmware/efi/efivars
/dev/nvme0n1p3  130G   47G   77G  39% /home
/dev/nvme0n1p1  511M  6.1M  505M   2% /boot/efi
tmpfs           1.5G  140K  1.5G   1% /run/user/1000
</code></pre><h4 id="determinando-los-estados-de-proceso">Determinando los estados de proceso</h4><p>Los estados de proceso pueden ser monitoreados para ver cualquier proceso estancado con un alto uso de memoria o de CPU.</p><p>Vimos anteriormente que el comando <code>ps</code> nos da información útil sobre un proceso. Pega un vistazo a las columnas <code>CPU</code> y <code>MEM</code>.</p><pre><code class="language-bash">[user@host ~]$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 runner         1  0.1  0.0 1535464 15576 ?       S  19:18   0:00 /inject/init
 runner        14  0.0  0.0  21484  3836 pts/0    S   19:21   0:00 bash --norc
 runner        22  0.0  0.0  37380  3176 pts/0    R+   19:23   0:00 ps aux
</code></pre><h4 id="monitoreo-del-sistema-en-tiempo-real">Monitoreo del sistema en tiempo real</h4><p>El monitoreo en tiempo real provee una ventana en el estado del sistema en tiempo real.</p><p>Una utilidad que puedes usar para hacer esto es el comando <code>top</code>.</p><p>El comando de arriba muestra una vista dinámica de los procesos del sistema, mostrando un resumen de la cabecera seguido de un proceso o una lista de hilos. A diferencia de su contraparte estática <code>ps</code>, <code>top</code> refresca continuamente las estadísticas del sistema.</p><p>Con <code>top</code>, puedes ver detalles bien organizados en una ventana compacta. Hay un número de argumentos, atajos y métodos resaltados que vienen junto con <code>top</code>.</p><p>También puedes matar procesos usando <code>top</code>. Para eso, presiona <code>k</code> y luego ingresa el id del proceso.</p><h4 id="interpretando-archivos-log">Interpretando archivos log</h4><p>Los archivos log de sistema y de aplicaciones conllevan muchísima información sobre el cual el sistema está pasando. Contienen información útil y códigos de error que apuntan a errores. Si buscas códigos de errores en los archivos log, la identificación de problemas y el tiempo de rectificación pueden ser reducidos enormemente.</p><h4 id="an-lisis-de-puertos-de-red">Análisis de puertos de Red</h4><p>El aspecto de red no debería ser ignorado ya que los fallos de red son comunes y podrían impactar en el sistema y en el flujo de tráfico. Problemas de red comunes incluyen agotamiento de puerto, asfixia de puerto, recursos sin liberarse, etcétera.</p><p>Para identificar tales problemas, necesitamos entender los estados de puerto.</p><p>Algunos de los estados de puertos son explicados de forma breve aquí:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>Estado</strong></th>
<th><strong>Descripción</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>LISTEN</td>
<td>Representa a los puertos que están esperando una solicitud de conexión de cualquier TCP y puerto remoto.</td>
</tr>
<tr>
<td>ESTABLISHED</td>
<td>Representa a las conexiones que están abiertas y los datos recibidos pueden ser entregados a su destino.</td>
</tr>
<tr>
<td>TIME WAIT</td>
<td>Representa el tiempo de espera para asegurar el reconocimiento de su solicitud de terminación de la conexión.</td>
</tr>
<tr>
<td>FIN WAIT2</td>
<td>Representa la espera de una solicitud de terminación de conexión del TCP remoto.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Exploremos cómo podemos analizar la información relacionado a los puertos en Linux.</p><p><strong>Rangos de Puerto:</strong> Los rangos de puerto son definidos en el sistema, y los rangos pueden ser aumentados/disminuidos respectivamente. En el fragmento de abajo, el rango es desde <code>15000</code> a <code>65000</code>, lo cual hace un total de <code>50000</code> (65000 - 15000) de puertos disponibles. Si los puertos utilizados están alcanzando o excediendo este límite, entonces hay un problema.</p><pre><code class="language-bash">[user@host ~]$ /sbin/sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 15000    65000
</code></pre><p>El error reportado en los archivos log en tales casos puede ser <code>Failed to bind to port</code> o <code>Too many connections</code>.</p><h4 id="identificando-p-rdidas-de-paquetes">Identificando pérdidas de paquetes</h4><p>En el monitoreo de sistema, necesitamos asegurarnos que la comunicación entrante y saliente está intacto.</p><p>Un comando útil es <code>ping</code>. <code>ping</code> llega al sistema destinatario y trae de vuelta la respuesta. Fíjate que las últimas pocas líneas de estadísticas que muestran el porcentaje y tiempo de la pérdida de los paquetes.</p><pre><code class="language-bash"># ping IP destinatario
[user@host ~]$ ping 10.13.6.113
 PING 10.13.6.141 (10.13.6.141) 56(84) bytes of data.
 64 bytes from 10.13.6.113: icmp_seq=1 ttl=128 time=0.652 ms
 64 bytes from 10.13.6.113: icmp_seq=2 ttl=128 time=0.593 ms
 64 bytes from 10.13.6.113: icmp_seq=3 ttl=128 time=0.478 ms
 64 bytes from 10.13.6.113: icmp_seq=4 ttl=128 time=0.384 ms
 64 bytes from 10.13.6.113: icmp_seq=5 ttl=128 time=0.432 ms
 64 bytes from 10.13.6.113: icmp_seq=6 ttl=128 time=0.747 ms
 64 bytes from 10.13.6.113: icmp_seq=7 ttl=128 time=0.379 ms
 ^C
 --- 10.13.6.113 ping statistics ---
 7 packets transmitted, 7 received,0% packet loss, time 6001ms
 rtt min/avg/max/mdev = 0.379/0.523/0.747/0.134 ms
</code></pre><p>Los paquetes también pueden ser capturados en tiempo de ejecución usando <code>tcpdump</code>. Veremos esto más adelante.</p><h4 id="reuniendo-estad-sticas-para-problemas-cr-ticos">Reuniendo estadísticas para problemas críticos</h4><p>Siempre es una buena práctica reunir ciertas estadísticas que sería útil para identificar la causa raíz luego. Usualmente, después del reinicio del sistema o del reinicio de los servicios, perdemos los instantáneos y archivos log previos del sistema.</p><p>Abajo hay algunos de los métodos para capturar el instantáneo del sistema.</p><ul><li><strong>Copia de seguridad de los Archivos Log</strong></li></ul><p>Antes de hacer cualquier cambio, copia los archivos log a otra ubicación. Esto es crucial para entender en qué condición estaba el sistema durante el tiempo del problema. A veces los archivos de registro son la única ventana para ver los estados anteriores del sistema ya que se pierden otras estadísticas de tiempo de ejecución.</p><ul><li><strong>TCP Dump</strong></li></ul><p>Tcpdump es una utilidad de línea de comandos que te permiten capturar y analizar tráfico de red entrante y saliente. Es mayormente usado para ayudar a solucionar problemas de red. Si sientes que el tráfico de sistema está siendo impactado, toma a <code>tcpdump</code> como sigue:</p><pre><code class="language-bash">sudo tcpdump -i any -w

# Donde,
# -i any captura tráfico de todas las interfaces
# -w especifica la salida del nombre de archivo

# Para el comando después de unos pocos mins ya que el tamaño del archivo podría incrementar
# usa la extensión de archivo como .pcap
</code></pre><p>Una vez que el <code>tcpdump</code> es capturado, puedes usar herramientas como Wireshark para analizar el tráfico de forma visual.</p><!--kg-card-begin: html--><h3 id="conclusion">Conclusión</h3><!--kg-card-end: html--><p>Gracias por leer el libro hasta el final. Si lo encontraste útil, considera compartirlo con los demás.</p><p>Este libro no termina aquí. Continuaré mejorándolo y agregando nuevos materiales en el futuro. Si encontraste algún problema o te gustaría sugerir alguna mejora, <a href="https://github.com/zairahira/Mastering-Linux-Handbook">no dudes en abrir una PR / Issue</a>.</p><p><strong>¡Manténte conectado y continúa tu jornada de aprendizaje!</strong></p><p>Tu jornada con Linux no tiene que terminar aquí. Manténte contectado y lleva tus habilidades al siguiente nivel:</p><ol><li><strong>Sígueme en las redes sociales</strong>:</li><li><a href="https://twitter.com/hira_zaira"><strong>X</strong></a>: Comparto contenido útil de forma corta allí. Mi DMs están siempre abiertos.</li><li><a href="https://www.linkedin.com/in/zaira-hira/"><strong>LinkedIn</strong></a>: Comparto artículos y posts sobre tech allí. Deja una recomendación en LinkedIn y apóyame en habilidades relevantes.</li><li><strong>Obtén acceso a contenido exclusivo</strong>: Para una ayuda personal y contenido exclusivo ve <a href="https://buymeacoffee.com/zairah/extras">aquí</a>.</li></ol><p>Mis <a href="https://www.freecodecamp.org/news/author/zaira/">artículos</a> y libros, como este, son parte de mi misión para aumentar el acceso a contenido de calidad para todos. Este libro también estará abierto para ser traducido a otros idiomas. Cada pieza toma mucho tiempo y esfuerzo para escribir. Este libro estará gratuito, para siempre. Si has disfrutado mi trabajo y quieres mantenerme motivado, considera <a href="https://buymeacoffee.com/zairah">comprarme un café</a>.</p><p>Gracias una vez más y, ¡feliz aprendizaje!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Comando Chmod: Cómo cambiar permisos de archivo en Linux ]]>
                </title>
                <description>
                    <![CDATA[ Uno de los primeros comandos que aprendí en Linux fue el comando touch que crea un archivo usando la línea de comando. Si alguna vez tratas de crear, por ejemplo, un archivo de texto, todo lo que tienes que hacer es escribir touch filename.txt, presionar Enter, y el archivo es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/comando-chmod-como-cambiar-permisos-de-archivo-en-linux/</link>
                <guid isPermaLink="false">655ca6f2bcc2a003e70e3409</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Thu, 25 Jan 2024 15:26:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/pexels-artem-beliaikin-912005.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-change-file-permissions-with-the-chmod-command-on-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Chmod Command – How to Change File Permissions in Linux</a>
      </p><p>Uno de los primeros comandos que aprendí en Linux fue el comando <code>touch</code> que crea un archivo usando la línea de comando.</p><p>Si alguna vez tratas de crear, por ejemplo, un archivo de texto, todo lo que tienes que hacer es escribir <code>touch filename.txt</code>, presionar Enter, y el archivo es creado para ti en la carpeta donde estás. Luego puedes escribir lo que quieras dentro usando el editor de archivos de tu gusto.</p><p>Sin embargo, cuando se trata de crear scripts, las cosas se pueden poner un poco más complicadas. ¿Por qué es eso?</p><p>Déjame intentar mostrarte esto con un ejemplo. Supón que quieres crear un script usando 'touch'. Escribe <code>touch example.sh</code>, presiona Enter, y ahí lo tienes. Una vez más, puedes escribirlo usando un editor de archivos.</p><p>Con todo listo, todo lo que nos resta hacer es probarlo. Escribe <code>./sample.sh</code> y presiona Enter para ver tu script en acción y... pero, ¿qué me está diciendo este mensaje?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-13-58-39.png" class="kg-image" alt="Screenshot-from-2022-03-20-13-58-39" width="600" height="400" loading="lazy"></figure><h2 id="-por-qu-necesitamos-permisos"><strong>¿Por qué necesitamos<strong> </strong>permisos<strong>?</strong></strong></h2><p>¡Yo soy el administrador! ¿Cómo es posible que no tengo permiso para ejecutar un script que yo mismo escribí segundos atrás?</p><p>En realidad hay una razón para eso – y, para ser honesto, la mayoría de usuarios deberían de ser agradecidos por ello, ya que no ser capaz de ejecutar scripts sin saber qué se está haciendo frecuentemente te previene de poner tu sistema en riesgo.</p><p>Vamos a conversar rápidamente sobre los permisos primero. Luego pasaremos a descubrir cómo cambiarlos.</p><p>Para obtener más información sobre tu archivo, usaremos el comando que lista los archivos en una carpeta: <code>ls</code>. </p><p>Después de escribir <code>ls</code> y presionar Enter, esto es lo que obtenemos de la línea de comando:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-05-58.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-05-58" width="600" height="400" loading="lazy"></figure><p>Lo que hace es listar todos los archivos visibles de la carpeta en el que estás en este momento. Al agregarle la bandera <code>-l</code>, te provee con más información sobre los archivos de la carpeta. Este es el resultado cuando escribimos <code>ls -l</code> y presionamos Enter:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-08-00.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-08-00" width="600" height="400" loading="lazy"></figure><p>Vemos el mismo archivo(s), pero con bastante información. Para empezar, tenemos una secuencia de diez guiones y letras que podrían parecer sin sentido a la primera. Esto es en realidad es el mapeo de permisos que tu archivo tiene.</p><p>El primer carácter puede ser un guion (<code>-</code> para un archivo común), una <code>d</code> (para una carpeta/directorio), o una <code>l</code> (para un enlace suave). Para ser más sencillos, me enfocaré en los archivos simples, aunque los permisos son válidos para todos estos tipos de archivos/carpetas.</p><p>Después del primer carácter, los otros 9 pueden ser divididos en grupos de tres. El primer trío muestran los permisos para el usuario actual. El próximo muestra los permisos para este grupo. Los últimos tres son los permisos para todos los usuarios que no encajan en esta categoría.</p><p>Para nuestra explicación, enfoquémonos en los primeros tres permisos, ya que no vamos a cambiar grupos ni nada parecido.</p><p>El primer trío dice <code>rw-</code>.</p><p>Es tiempo de entender qué son estos. Hay tres cosas que puedes hacer normalmente con un archivo: leerlo, escribir en él, y ejecutarlo. Eso es, básicamente, lo que significa esas tres letras.</p><p>La primera <code>r</code> se refiere a permisos de lectura. Luego tenemos <code>w</code> para permisos de escritura. Finalmente, un guion, lo que significa que cualquier cosa que debería estar ahí no está. Lo que debería de haber allí es una <code>x</code>, lo que significa ejecutable.</p><p>Así que, hablando del usuario actual (yo), los permisos que tengo para este archivo son los permisos de lectura y de escritura. No puedo, sin embargo, ejecutar el archivo <code>sample.sh</code>. Por eso, cuando tratamos de ejecutar el archivo, tengo ese mensaje 'permiso denegado'.</p><p>Entonces, ¿cómo puedo ejecutar este archivo? Ahí es donde el comando <code>chmod</code> entra en acción.</p><h2 id="-qu-hace-chmod"><strong>¿Qué hace <strong>chmod?</strong></strong></h2><p>Bueno, he estado mencionando 'permisos' desde el inicio del artículo. Ampliemos esta explicación un poco para denotar qué son 'permisos' para acceder a un archivo de un cierto <em>modo</em>. Esto significa que <code>r</code> denota el permiso de acceder al archivo en modo lectura, <code>w</code> denota el permiso de acceder al archivo en modo escritura, y <code>x</code> denota el permiso de acceder al archivo en modo ejecución.</p><p>¿Por qué te estoy diciendo esto? Por el comando del que trata este artículo. <code>chmod</code> significa 'cambiar el modo'. En otras palabras, cuando uses este comando, estás cambiando el modo del archivo a cualquier modo que quieres usar.</p><h2 id="c-mo-usar-los-operadores-con-cmod"><strong>Cómo usar los Operadores con<strong> </strong></strong><code><strong><strong>cmod</strong></strong></code></h2><p>Es necesario usar un operador con el comando chmod. Sirve para especificar el tipo de cambio que quieres hacer en los permisos.</p><p>Por ejemplo, <code>+</code> es el operador que usas para agregar un permiso a los que el archivo ya tiene. <code>-</code> remueve un permiso de la lista. Hay también el operador <code>=</code>, lo cual reinicia los permisos, así puedes definirlos nuevamente.</p><p>En nuestro caso, al escribir <code>chmod -w sample.sh</code>, lo que le estoy pidiendo al comando que haga es remover el permiso de escritura. Así que lo que tendría que hacer para agregar el permiso de ejecución es escribir <code>chmod +x sample.sh</code>.</p><p>Si ahora intento ejecutar el archivo, cualquier cosa que ponga en el script ahora va a ser ejecutado.</p><p>Usando <code>ls -l</code>, esto es lo que tendría ahora.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-12-03.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-12-03" width="600" height="400" loading="lazy"></figure><h2 id="-qui-n-obtiene-el-permiso"><strong>¿Quién obtiene<strong> </strong>el permiso<strong>?</strong></strong></h2><p>Algo más que vale la pena señalar es quién es el que obtiene este permiso. Verás que el 'x' es dado a todos los usuarios, al dueño del archivo, grupo y otros. Si esto no es lo que quieres, tal vez sería bueno quitar el permiso de ejecución nuevamente con <code>chmod -x sample.sh</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-16-11.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-16-11" width="600" height="400" loading="lazy"></figure><p>Para activar el permiso solamente para el dueño del archivo (yo, en este caso), deberíamos agregar una 'u' antes de '+x', así:</p><p><code>chmod u+x sample.sh</code></p><p>Escribe <code>ls -l</code>, esto es lo que tienes:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-18-22.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-18-22" width="600" height="400" loading="lazy"></figure><p>Si querías dar el permiso tanto para el dueño como su grupo, entonces el comando debería ser <code>chmod ug+x sample.sh</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-20-25.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-20-25" width="600" height="400" loading="lazy"></figure><p>¡Genial! Pienso que esto cubre lo que querría mostrarte. Hay otras cosas que te interesarían, como usar chmod con valores octales o binarios para representar los permisos. Pero estos son modos que usamos para tener los mismos resultados y creo que con las letras es una forma más sencilla de lograr estos resultados.</p><p>En caso de que quieras más información sobre el comando, una cosa que puedes hacer es escribir <code>chmod --help</code>, el cual te dará un resumen de lo que el comando puede hacer. Una descripción aún más detallada se puede lograr escribiendo <code>man chmod</code>.</p><p>Espero que este artículo te haya sido de utilidad. Para más artículos sobre comandos de Linux, visita <a href="https://www.freecodecamp.org/news">freecodecamp.org/espanol/news</a> y <a href="https://www.freecodecamp.org/news">freecodecamp.org/news</a>.</p><p>¡Feliz codificación! 😃</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo mejorar tu terminal de Bash: Una guía paso a paso con imágenes ]]>
                </title>
                <description>
                    <![CDATA[ En este blog iré en pasos para agregar Temas, Powerline, fuentes, y powerline-gitstatus para hacer que tu terminal de Bash luzca bello y útil como se muestra en la imagen de arriba. Resulta que, si estás usando Mac, tendrás que pasar por muchos obstáculos para hacer que esto funcione, ya ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-mejorar-tu-terminal-de-bash-una-guia-paso-a-paso-con-imagene/</link>
                <guid isPermaLink="false">64dcb5efd0a51e03c12959d6</guid>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Mon, 09 Oct 2023 14:49:12 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/08/1_QRJ9_60oCmcwRGfYqCbqSw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/jazz-up-your-bash-terminal-a-step-by-step-guide-with-pictures-80267554cb22/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Jazz Up Your Bash Terminal — A Step By Step Guide With Pictures</a>
      </p><p>En este blog iré en pasos para agregar Temas, Powerline, fuentes, y powerline-gitstatus para hacer que tu terminal de Bash luzca bello y útil como se muestra en la imagen de arriba.</p><p>Resulta que, si estás usando Mac, tendrás que pasar por muchos obstáculos para hacer que esto funcione, ya que muchas instrucciones son para linux, o están anticuados. Así que pensé en hacer un blog sobre esto - espero que te ayude.</p><blockquote>Notas:<br><br>1. Sigue los pasos cuidadosamente ya que cualquier error causará un montón de dolores de cabeza.<br><br>2. Esto es para MacOS y para el bash regular en la Terminal.app. No estoy usando ZSH o Hyper en este blog — Planeo escribir diferentes blogs para ellos.<br><br>3. Mis Versiones: Mac High Sierra; versión de git 2.14.3 (Apple Git-98); Python 2.7.10</blockquote><p>Bien, por defecto, cuando tienes un Mac nuevo, tu terminal lucirá como la imagen de abajo. Avancemos y agreguemos temas, fuentes, y así sucesivamente.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*A2RjRAGXHeUQtIIy5XIBwQ.png" class="kg-image" alt="1*A2RjRAGXHeUQtIIy5XIBwQ" width="800" height="629" loading="lazy"></figure><!--kg-card-begin: html--><h2><strong>Tabla de Contenidos</strong></h2>
<ul>
    <li><a href="#nuevo-tema">Paso 1 - Agregar un nuevo tema</a></li>
    <li><a href="#instalar-powerline">Paso 2 - Instalar Powerline</a></li>
    <ul style="padding-left: 10px;">
        <li><a href="#instalar-python">2.1 Instalar Python</a></li>
        <li><a href="#instalar-pip">2.2 Instala pip — Un Gestionador de paquetes para Python (similar a npm)</a></li>
        <li><a href="#instalar-xcode">2.3 Instala las herramientas de XCode Developer CLI</a></li>
        <li><a href="#instala-powerline">2.4 Instala Powerline</a></li>
        <li><a href="#agregar-powerline">2.5 Agregar el daemon de Powerline a bash</a></li>
    </ul>
    <li><a href="#fuentes-powerline">Paso 3 - Instalar las fuentes de Powerline</a></li>
    <ul style="padding-left: 10px;">
        <li><a href="#descargar-repo">3.1 Descargar el repo completo y extráelo</a></li>
        <li><a href="#instalar-fuentes">3.2 Instalar algunas fuentes</a></li>
        <li><a href="#selecciona-fuente">3.3 Selecciona la fuente en el Tema de la Terminal</a></li>
        <li><a href="#reinicia-terminal">3.4 Reinicia la Terminal</a></li>
    </ul>
    <li><a href="#info-git">Paso 4 - Agregar información de Git a la línea de comando</a></li>
    <ul style="padding-left: 10px;">
        <li><a href="#instalar-gitstatus">4.1 Instalar powerline-gitstatus</a></li>
        <li><a href="#agregar-esquemas">4.2 Agregar esquemas de color de powerline-gitstatus a Powerline</a></li>
        <li><a href="#activa-tema">4.3 Activa el Tema</a></li>
        <li><a href="#reinicia-daemon">4.4 Reinicia el Daemon</a></li>
        <li><a href="#reinicia-terminal">4.5 Reinicia la Terminal</a></li>
    </ul>
</ul><!--kg-card-end: html--><!--kg-card-begin: html--><h2 id="nuevo-tema"><strong>Paso 1 - Agregar un nuevo tema</strong></h2><!--kg-card-end: html--><p>El primero paso obvio es mejorar el Tema. La terminal no provee todos los temas geniales y elegantes que ves que otros desarrolladores usan. Descarguemos un Tema y agreguémoslo a la Terminal.</p><p>En este blog, agregaré el tema Solarized-Dark a nuestra terminal.</p><blockquote><a href="https://github.com/lysyi3m/osx-terminal-themes/tree/master/schemes"></a><a href="https://github.com/lysyi3m/osx-terminal-themes/tree/master/schemes" rel="noopener">e</a>ste repo de git <code><em><em>*.terminal</em></em></code> &nbsp;<code><em><em>right-click on the *.terminal file &gt; “open with" &gt; Te</em></em></code></blockquote><ol><li>Ve a <a href="http://ethanschoonover.com/solarized" rel="noopener">http://ethanschoonover.com/solarized</a></li><li>Desliza hacia abajo y descarga el Tema (solarized.zip)</li><li>Extrae el archivo solarized.zip</li><li>Abre la carpeta <strong><strong>osx-terminal.app-colors-solarized</strong></strong>. Esta carpeta contiene el Tema para la terminal.</li><li>Doble clic sobre el archivo <strong><strong><em><em>“Solarized Dark ansi.terminal”</em></em> — </strong></strong>Este es el tema específico para la terminal.app. </li></ol><p><em><em>Not</em>a<em>: </em>si te llega una advertencia que esto es de un desarrollador sin identificar, haz clic derecho sobre el archivo y selecciona "Abrir<em> </em>con" &gt; <em>Terminal opti</em></em>on<em>.</em></p><ol><li>En este punto, tienes el tema instalado en tu terminal. Solo necesitamos hacerlo como un tema por defecto.</li><li>Abrir Terminal &gt; Preferences &gt; Text y selecciona el tema “Solarized Dark …” theme y haz clic en “Default”.</li></ol><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*0hPqERUbwhdAXVQfdQih1A.png" class="kg-image" alt="1*0hPqERUbwhdAXVQfdQih1A" width="800" height="707" loading="lazy"></figure><p>De ahora en adelante, tu Terminal debería lucir como abajo.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*hvkwX_GZIXHQxuYY2987GQ.png" class="kg-image" alt="1*hvkwX_GZIXHQxuYY2987GQ" width="800" height="526" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="instalar-powerline"><strong>Paso 2 - Instalar Powerline</strong></h2><!--kg-card-end: html--><p>Powerline es una aplicación de Python y un complemento de línea de estado para vim, y provee líneas de estado y mensajes para varias otras aplicaciones, incluyendo zsh, bash, tmux, IPython, Awesome y Qtile.</p><p>Hace que la Terminal luzca como abajo.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*7SLVI9-_IBwEcmZpGaDvmw.png" class="kg-image" alt="1*7SLVI9-_IBwEcmZpGaDvmw" width="800" height="360" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="instalar-python"><strong>2.1 Instalar Python</strong></h3><!--kg-card-end: html--><p>Porque Powerline es una aplicación de Python, necesitamos tener Python y eso también una versión apropiada de Python.</p><ul><li>MacOS ya viene con Python instalado.<strong><strong> </strong>Asegúrate que la versión de<strong> Python</strong> sea<strong> 2.7.x </strong>escribiendo<strong> </strong></strong><code>python -V</code> en la Terminal</li><li>Si no es 2.7, instala <a href="https://brew.sh/" rel="noopener">Homebrew</a> que nos permite instalar varios software desde el CLI, ejecutando: <code>/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</code></li><li>Ejecuta <code>brew install python</code> para instalar la última versión de Python a través de Homebrew</li></ul><!--kg-card-begin: html--><h3 id="instalar-pip"><strong>2.2 Instala pip — Un Gestionador de paquetes para Python (similar a npm)</strong></h3><!--kg-card-end: html--><p>Instala pip ejecutando el siguiente comando:</p><p><code>$ sudo easy_install pip</code></p><!--kg-card-begin: html--><h3 id="instalar-xcode"><strong>2.3 Instala las herramientas de XCode Developer CLI</strong></h3><!--kg-card-end: html--><p>Las herramientas de XCode Developer CLI son utilizados por Powerline y otras aplicaciones que manipulan las características principales de OSX. Así que asegúrate de instalar las herramientas de XCode CLI ejecutando el siguiente comando.</p><p><code>$ xcode-select —-install</code></p><blockquote><code><em><em>xcode-select -r</em></em></code></blockquote><!--kg-card-begin: html--><h3 id="instala-powerline"><strong>2.4 Instala Powerline</strong></h3><!--kg-card-end: html--><p>Finalmente, instala el Powerline (versión estable) por medio de pip ejecutando el siguiente comando:</p><pre><code class="language-bash">$ pip install --user powerline-status</code></pre><p>Si quieres instalar la última rama de desarrollo, usa:</p><pre><code class="language-bash">$ pip install --user git+git://github.com/powerline/powerline  //dev</code></pre><!--kg-card-begin: html--><h3 href="https://www.freecodecamp.org/espanol/news/como-mejorar-tu-terminal-de-bash-una-guia-paso-a-paso-con-imagene/agregar-powerline"><strong>2.5 Agregar el daemon de Powerline a bash</strong></h3><!--kg-card-end: html--><p>Ahora necesitamos agregar el daemon de Powerline a bash así puede monitorear los mensajes de la Terminal y hacer cambios.</p><p><strong><strong>2.5.1 </strong>Copiar la ubicación de la instalación de<strong> Powerline</strong></strong></p><p>Puedes configurar la ubicación de Powerline ejecutando lo siguiente: <code>pip show powerline-status</code> Copia el valor del campo <code>Location</code>.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*1Hi5bB475XFf-Iu43tAFvA.png" class="kg-image" alt="1*1Hi5bB475XFf-Iu43tAFvA" width="800" height="183" loading="lazy"></figure><p><strong><strong>2.5.2 </strong>Agregar<strong> </strong>el<strong> daemon </strong>con una ubicación apropiada<strong> </strong>a<strong> .bash_profile</strong></strong></p><ol><li>Asegúrate de tener un archivo <code>.bash_profile</code> en tu carpeta raíz. Si no lo tienes crea uno haciendo: <code>cd ~ &amp;&amp; touch ~/.bash_profile</code></li></ol><p>2. Abre <code>.bash_profile</code> y agrega lo siguiente:</p><pre><code class="language-bash">export PATH=$PATH:$HOME/Library/Python/2.7/bin
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /Users/rupa/Library/Python/2.7/lib/python/site-packages/powerline/bindings/bash/powerline.sh</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*QY-1dEQtAn6SUOpgOTQcsg.png" class="kg-image" alt="1*QY-1dEQtAn6SUOpgOTQcsg" width="800" height="159" loading="lazy"><figcaption>Algunos detalles sobre bash_profile</figcaption></figure><blockquote><em><em>Not</em>a<em>: </em>La ubicación<em> /Users/rupa/Library/Python/2.7/lib/python/site-packages/ </em>es del paso anterior<em> (2.5.1). </em>Cambiálo<em> </em>para coincidir la ubicación de tu computadora<em>.</em></em></blockquote><p><strong><strong>2.5.3. </strong>Reinicia<strong> </strong>la<strong> Terminal</strong></strong></p><p>Sal completamente de la Terminal si está abierto (Terminal &gt; Quit Terminal). Y ábrelo de nuevo.</p><blockquote><code><em><em>$ source ~/.bash_profile</em></em></code> &nbsp;<code><em><em>powerline-config</em></em></code></blockquote><p><strong><strong>2.5.4 </strong>Tu nueva<strong> Terminal</strong></strong></p><p>Tu nueva Terminal debería lucir como el de abajo. Debería estar usando el tema "Solarized Dark ansi" y debería mostrar Powerline en la línea de comando. Pero nota también que hay caracteres "?"! Esto es debido a que Powerline usa varios íconos y fuentes que no están disponibles por defecto. Así que necesitamos instalar las fuentes.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*fVqgdIqo7AIw7EJdcHZZxw.png" class="kg-image" alt="1*fVqgdIqo7AIw7EJdcHZZxw" width="800" height="473" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="fuentes-powerline"><strong>Paso 3 - Instalar las fuentes de Powerline</strong></h2><!--kg-card-end: html--><p>Para instalar las fuentes de Powerline, simplemente ve a <a href="https://github.com/powerline/fonts" rel="noopener">https://github.com/powerline/fonts</a>. Allí verás un montón de carpetas. Cada una es una fuente, alias "Fuentes parcheadas".</p><blockquote>Se llaman “Fuentes parcheadas” porque las personas han tomado fuentes regulares y le han agregado/parcheado íconos y fuentes específicos de Powerline adicionales.</blockquote><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*sYBQZYzxe37bkmtBUw_Oww.png" class="kg-image" alt="1*sYBQZYzxe37bkmtBUw_Oww" width="800" height="398" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="descargar-repo"><strong>3.1 Descargar el repo completo y extráelo</strong></h3><!--kg-card-end: html--><ul><li>Haz clic en el botón “Clone or download” y descarga el repo completo, así intentas varias fuentes.</li><li>Extrae el archivo fonts-master.zip</li></ul><!--kg-card-begin: html--><h3 id="instalar-fuentes"><strong>3.2 Instalar algunas fuentes</strong></h3><!--kg-card-end: html--><p>Abramos la carpeta de fuentes <strong>Meslo dotted</strong>. Lucirá como el de abajo. Verás un montón de archivos .ttf. Cada uno de ellos es una fuente, pero algunos son versiones "negritas" de la fuente, algunas son versiones "regular" y así sucesivamente.</p><p>Simplemente, haz doble clic en el archivo .ttf y presionar "Install font" para instalar la fuente en tu computadora.</p><p>Para nuestro caso, vamos a instalar "“Meslo LG L DZ Regular for Powerline.ttf” y “Meslo LG L DZ Italic for Powerline.ttf”. Esto agregará una versión <strong><strong><em><em>regular</em></em></strong></strong> y una versión <strong><strong><em><em>Italic</em></em></strong></strong> de la fuente <strong><strong><em><em>Meslo</em></em></strong></strong>.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*zmoF1ksmDJfRH0lGK00GKg.png" class="kg-image" alt="1*zmoF1ksmDJfRH0lGK00GKg" width="800" height="447" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="selecciona-fuente"><strong>3.3 Selecciona la fuente en el Tema de la Terminal</strong></h3><!--kg-card-end: html--><p>¿Recuerdas que agregamos el tema "Solarized Dark" en el Paso 1? Eso no tenía ninguna fuente y MacOS tenía algunas fuentes por defecto. Todo lo que necesitamos hacer es configurar nuestra fuente <strong>Meslo dotted</strong> para este tema y ¡ya estamos listo!</p><ol><li>Abre Terminal &gt; Preferences &gt; Text</li><li>Selecciona el Tema <strong><strong>Solarized Dark ansi</strong></strong></li><li>Haz clic en el botón “Font” — Esto abre el diálogo “Fonts”</li><li>En el diálogo “Fonts”, selecciona “Meslo LG L DZ for Powerline” en la Familia y también selecciona el tamaño de fuente 14 (así es más fácil de leer).</li></ol><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*SbKUVJxHJ_PR8yh2cbSESw.png" class="kg-image" alt="1*SbKUVJxHJ_PR8yh2cbSESw" width="800" height="359" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="reinicia-terminal"><strong>3.4 Reinicia la Terminal</strong></h3><!--kg-card-end: html--><p>Sal completamente de la Terminal (Terminal &gt; Quit Terminal) y luego vuelve a abrirlo.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*5pfC372U2Uz9Q5SQJSqKzA.png" class="kg-image" alt="1*5pfC372U2Uz9Q5SQJSqKzA" width="800" height="713" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="info-git"><strong>Paso 4 - Agregar información de Git a la línea de comando</strong></h2><!--kg-card-end: html--><p>Para mostrar varios estados de Git en la línea de comando, necesitamos instalar &nbsp;<a href="https://github.com/jaspernbrouwer/powerline-gitstatus" rel="noopener">powerline-gitstatus</a>. Es una extensión simple a Powerline y agrega múltiples colores y Temas para mostrar varias informaciones de estado de git.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*NKRx9-fVCZIiWKW_Tb0lhA.png" class="kg-image" alt="1*NKRx9-fVCZIiWKW_Tb0lhA" width="800" height="192" loading="lazy"><figcaption>PS: estaremos lidiando con archivos en las carpetas “color schemes” y “themes”</figcaption></figure><!--kg-card-begin: html--><h3 id="instalar-gitstatus"><strong>4.1 Instalar powerline-gitstatus</strong></h3><!--kg-card-end: html--><pre><code class="language-bash">pip install --user powerline-gitstatus</code></pre><blockquote>Nota: El comando “ — user” es requerido para instalarlo en el perfil del usuario.</blockquote><!--kg-card-begin: html--><h3 id="agregar-esquemas"><strong>4.2 Agregar esquemas de color de powerline-gitstatus a Powerline</strong></h3><!--kg-card-end: html--><p><strong>4.2.1 Abre la siguiente carpeta <code>colorschemes/shell/default.json</code></strong></p><pre><code class="language-bash">${powerline-install-directory}/powerline/config_files/colorschemes/shell/default.json

//For example:
/Users/rupa/Library/Python/2.7/lib/python/site-packages/powerline/config_files/colorschemes/shell/default.json</code></pre><p><strong>4.2.2 Agrega los siguientes colores:</strong></p><p>Como mencioné en el <a href="https://github.com/jaspernbrouwer/powerline-gitstatus#installation">readme</a> de powerline-gistatus. PS: Solo copa los colores dentro de “groups” y luego añádelo al archivo default.json como se muestra abajo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*shKgrO87LFrjoGMb2uOEVg.png" class="kg-image" alt="1*shKgrO87LFrjoGMb2uOEVg" width="800" height="348" loading="lazy"><figcaption>Haz clic para hacer zoom</figcaption></figure><p>Aquí está mi archivo default.json de esquemas de colores (puedes copiar y pegar esto):</p><pre><code class="language-json">{
	"name": "Default color scheme for shell prompts",
	"groups": {
		"hostname": {
			"fg": "brightyellow",
			"bg": "mediumorange",
			"attrs": []
		},
		"environment": {
			"fg": "white",
			"bg": "darkestgreen",
			"attrs": []
		},
		"mode": {
			"fg": "darkestgreen",
			"bg": "brightgreen",
			"attrs": ["bold"]
		},
		"attached_clients": {
			"fg": "white",
			"bg": "darkestgreen",
			"attrs": []
		},

		"gitstatus": {
			"fg": "gray8",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_branch": {
			"fg": "gray8",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_branch_clean": {
			"fg": "green",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_branch_dirty": {
			"fg": "gray8",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_branch_detached": {
			"fg": "mediumpurple",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_tag": {
			"fg": "darkcyan",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_behind": {
			"fg": "gray10",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_ahead": {
			"fg": "gray10",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_staged": {
			"fg": "green",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_unmerged": {
			"fg": "brightred",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_changed": {
			"fg": "mediumorange",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_untracked": {
			"fg": "brightestorange",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus_stashed": {
			"fg": "darkblue",
			"bg": "gray2",
			"attrs": []
		},
		"gitstatus:divider": {
			"fg": "gray8",
			"bg": "gray2",
			"attrs": []
		}
	},
	"mode_translations": {
		"vicmd": {
			"groups": {
				"mode": {
					"fg": "darkestcyan",
					"bg": "white",
					"attrs": ["bold"]
				}
			}
		}
	}
}</code></pre><!--kg-card-begin: html--><h3 id="activa-tema"><strong>4.3 Activa el Tema</strong></h3><!--kg-card-end: html--><p>4.3.1 Abre el archivo default.json del Tema</p><pre><code class="language-bash">${powerline-install-directory}/powerline/config_files/themes/shell/default.json

//Por ejemplo:
/Users/rupa/Library/Python/2.7/lib/python/site-packages/powerline/config_files/themes/shell/default.json</code></pre><p>4.3.2 Agrega lo siguiente al default.json</p><pre><code class="language-json">{
    "function": "powerline_gitstatus.gitstatus",
    "priority": 40
}</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*QJIvX5hfNpUWZgoHTQ_nbQ.png" class="kg-image" alt="1*QJIvX5hfNpUWZgoHTQ_nbQ" width="800" height="713" loading="lazy"></figure><p>Abajo está mi archivo default.json del Tema de Powerline (puedes copiar y pegar esto):</p><blockquote>Nota: He removido todo de la sección de la "derecha" y también removí “job number” (“jobnum”) para manetener las cosas limpias. De otra manera, verás un pequeño artefacto en el borde lateral derecho de la línea de comando.</blockquote><pre><code class="language-json">{
	"segments": {
		"left": [{
				"function": "powerline.segments.shell.mode"
			},
			{
				"function": "powerline.segments.common.net.hostname",
				"priority": 10
			},
			{
				"function": "powerline.segments.common.env.user",
				"priority": 30
			},
			{
				"function": "powerline.segments.shell.cwd",
				"priority": 10
			}, {
				"function": "powerline_gitstatus.gitstatus",
				"priority": 40
			}
		],
		"right": []
	}
}</code></pre><!--kg-card-begin: html--><h3 id="reinicia-daemon"><strong>4.4 Reinicia el Daemon</strong></h3><!--kg-card-end: html--><p>Guarda el archivo y ejecuta lo siguiente: <code><em><em>powerline-daemon —-replace</em></em></code><em><em> </em>en la<em> Terminal.</em></em></p><blockquote><strong>Nota Importante<strong>:</strong></strong> &nbsp;<strong>reinicia</strong> <strong>el<strong> daemon </strong>para ver los cambios<strong> </strong>reflejados<strong> </strong></strong> <code><em><em>powerline-daemon —-replace</em></em></code></blockquote><!--kg-card-begin: html--><h3 id="reinicia-terminal"><strong>4.5 Reinicia la Terminal</strong></h3><!--kg-card-end: html--><p>Sal de la Terminal (Terminal &gt; Quit Terminal) y ábrelo de vuelta.</p><p>En este punto, ¡ya estamos listo! ¡Uf! Si abres la Terminal, y navegas a cualquier repo de git, y juegas un poco, debería lucir como lo siguiente. </p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*QRJ9_60oCmcwRGfYqCbqSw.png" class="kg-image" alt="1*QRJ9_60oCmcwRGfYqCbqSw" width="800" height="213" loading="lazy"></figure><p>Aquí está como debería lucir en el Tema Solarized-Light:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*8yii2h-RBMX3j5dtMagr2Q.png" class="kg-image" alt="1*8yii2h-RBMX3j5dtMagr2Q" width="800" height="199" loading="lazy"></figure><p>Aquí está cómo debería lucir en el Tema <a href="https://raw.githubusercontent.com/lysyi3m/osx-terminal-themes/master/schemes/Cobalt2.terminal" rel="noopener">Cobalt2</a>:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*hYHwy__bxYoA8cji8E3plQ.png" class="kg-image" alt="1*hYHwy__bxYoA8cji8E3plQ" width="800" height="167" loading="lazy"></figure><p> ¡Gracias!</p><p>Si tienes preguntas, por favor no dudes en preguntarme en Twitter: <a href="https://twitter.com/rajaraodv" rel="noopener">https://twitter.com/rajaraodv</a></p><h4 id="mejoras-de-terminal"><strong>Mejoras de Terminal</strong></h4><ol><li><a href="https://www.freecodecamp.org/espanol/news/mejora-tu-terminal-zsh-en-siete-pasos-una-guia-visual/">Mejora tu terminal "ZSH" en siete pasos: una guía visual</a></li></ol><h4 id="si-te-fue-til-por-favor-compartirlo-gracias-"><strong>Si te fue útil, por favor, ¡compartirlo! ¡Gracias!</strong></h4> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Condicional If en Bash - Sintaxis If-Else en Linux Shell ]]>
                </title>
                <description>
                    <![CDATA[ Cuando se programa, es posible que necesites tomar decisiones basadas en ciertas condiciones. Las condiciones son expresiones que se evalúan como una expresión booleana (true o false). Las sentencias que ayudan a ejecutar diferentes ramas de código basándose en ciertas condiciones se conocen como sentencias condicionales. if...else es una de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/condicional-if-en-bash/</link>
                <guid isPermaLink="false">649168ee9764040891b7eae5</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Beatriz I Bravo ]]>
                </dc:creator>
                <pubDate>Mon, 07 Aug 2023 06:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/Bash-Condicional-If--Ejemplo-de-Sintaxis-If-Else-en-Linux-Shell.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/bash-if-statement-linux-shell-if-else-syntax-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash If Statement – Linux Shell If-Else Syntax Example</a>
      </p><p>Cuando se programa, es posible que necesites tomar decisiones basadas en ciertas condiciones. Las condiciones son expresiones que se evalúan como una expresión booleana (<code>true</code> o <code>false</code>).</p><p>Las sentencias que ayudan a ejecutar diferentes ramas de código basándose en ciertas condiciones se conocen como sentencias condicionales.</p><p><code>if...else</code> es una de las sentencias condicionales utilizadas más comúnmente. Al igual que otros lenguajes de programación, la programación de Bash también soporta sentencias <code>if...else</code>. Y lo estudiaremos en detalle en esta publicación.</p><h2 id="sintaxis-de-las-declaraciones-if"><strong>Sintaxis de las declaraciones<strong> <code>if</code> </strong></strong></h2><p>Puedes utilizar las declaraciones <code>if</code> de varias formas. &nbsp;La estructura genérica de las declaraciones &nbsp;<code>if</code> es la siguiente:</p><ul><li>Usando solo una declaración <code>if</code>: &nbsp; <code>if...then...fi</code></li><li>Usando una declaración <code>if</code> con una declaración <code>else</code>: &nbsp; <code>if...then...else...fi</code> </li><li>Usando varias declaraciones <code>else</code> Cuando estás utilizando una sola declaración <code>if</code>: <code>if..elif..else..fi</code></li></ul><h2 id="c-mo-utilizar-la-declaraci-n-if"><strong>Cómo utilizar la declaración<strong> <code>if</code> </strong></strong></h2><p>Cuando estás utilizando una sola declaración <code>if</code> , la sintaxis es la siguiente:</p><pre><code class="language-bash">if [ condition ]
then
	statement
fi</code></pre><blockquote>Ten en cuenta que los espacios forman parte de la sintaxis y no deben ser eliminados</blockquote><p>Veamos un ejemplo donde estamos comparando dos números para ver si el primer número es el más pequeño.</p><pre><code class="language-bash">#! /bin/sh

a=5
b=30

if [ $a -lt $b ]
then
        echo "a is less than b"
fi</code></pre><p>Si ejecutas el fragmento anterior, la condición &nbsp;<code>if [ $a -lt $b ]</code> se evalúa como <code>True</code>, y se ejecuta la declaración dentro de la declaración if.</p><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-bash">a is less than b</code></pre><h2 id="-c-mo-utilizar-la-declaraci-n-if-else"><strong>¿Cómo utilizar la declaración<strong> <code>if .. else</code></strong>?</strong></h2><p>Cuando estás utilizando una declaración <code>if</code> y quieres añadir otra condición, la sintaxis es la siguiente:</p><pre><code class="language-bash">if [ condition ]
then
	statement
else
	do this by default
fi</code></pre><p>Veamos un ejemplo en el que queramos encontrar si el primer número es mayor o menor que el segundo. Aquí, &nbsp;<code>if [ $a -lt $b ]</code> se evalúa como <code>false</code>, lo que provoca que se ejecute la parte else del código.</p><pre><code class="language-bash">#! /bin/sh

a=99
b=45

if [ $a -lt $b ]
then
        echo "a is less than b"
else
        echo "a is greater than b"
fi</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-bash">a is greater than b</code></pre><h2 id="-c-mo-utilizar-las-declaraciones-if-elif-else"><strong>¿Cómo utilizar las declaraciones<strong> <code>if..elif..else</code></strong>?</strong></h2><p>Digamos que quieres añadir condiciones y comparaciones adicionales para hacer que el código sea dinámico. En este caso, la sintaxis se vería así:</p><pre><code class="language-bash">if [ condition ]
then
	statement
elif [ condition ] 
then
	statement 
else
	do this by default
fi</code></pre><p>Para crear comparaciones significativas, podemos usar los operadores lógicos AND <code>-a</code> y OR <code>-o</code>.</p><p>En este ejemplo, vamos a determinar el tipo de triángulo utilizando las siguientes condiciones:</p><ul><li><code>Escaleno</code>: &nbsp;Un triángulo en el que cada lado tiene una longitud diferente.</li><li><code>Isósceles</code>: Un triángulo en el que 2 de sus lados tienen la misma longitud.</li><li><code>Equilátero</code>: Un triángulo en el que todos los lados tienen la misma longitud.</li></ul><pre><code class="language-bash">read a
read b
read c

if [ $a == $b -a $b == $c -a $a == $c ]
then
echo ESCALENO

elif [ $a == $b -o $b == $c -o $a == $c ]
then
echo ISOSCELES
else
echo EQUILATERO

fi</code></pre><p>En el ejemplo anterior, el script le pediría al usuario que ingrese los tres lados del triángulo. Luego, compararía los lados y decidiría el tipo de triángulo.</p><pre><code>3
4
5
SCALENE</code></pre><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Puedes fácilmente dividir tu código en ramas basándose en condiciones como <code>if..else</code> y hacer el código más dinámico. En este tutorial, aprendiste la sintaxis de <code>if...else</code> junto con algunos ejemplos.</p><p>Espero que hayas encontrado este tutorial útil.</p><p>Comenta que aprendiste de este tutorial. ¡Házmelo saber en &nbsp;<a href="https://twitter.com/hira_zaira">Twitter</a>!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Arreglo Bash: Cómo declarar un arreglo de cadenas en un script Bash ]]>
                </title>
                <description>
                    <![CDATA[ Los scripts de Bash te otorgan una forma conveniente de automatizar las tareas de la línea de comandos. Con Bash, puedes hacer muchas de las cosas que harías en otros lenguajes de secuencias de comandos o programación. Puedes crear y usar variables, ejecutar bucles, usar lógica condicional y almacenar datos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/arreglo-bash-como-declarar-un-arreglo-de-cadenas-en-un-script-bash/</link>
                <guid isPermaLink="false">6429b31fcbd6cf076f06abe0</guid>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ BlackeyeB ]]>
                </dc:creator>
                <pubDate>Mon, 10 Apr 2023 19:21:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/pexels-belle-co-1000445.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/bash-array-how-to-declare-an-array-of-strings-in-a-bash-script/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash Array – How to Declare an Array of Strings in a Bash Script</a>
      </p><p>Los scripts de Bash te otorgan una forma conveniente de automatizar las tareas de la línea de comandos.</p><p>Con Bash, puedes hacer muchas de las cosas que harías en otros lenguajes de secuencias de comandos o programación. Puedes crear y usar variables, ejecutar bucles, usar lógica condicional y almacenar datos en arreglos.</p><p>Si bien la funcionalidad puede ser muy familiar, la sintaxis de Bash puede ser complicada. En este artículo, aprenderás cómo declarar arreglos y luego cómo usarlos en tu código.</p><h2 id="c-mo-declarar-un-arreglo-en-bash"><strong>Cómo declarar un </strong>arreglo<strong> en Bash</strong></h2><p>Declarar un arreglo en Bash es fácil, pero presta atención a la sintaxis. Si estás acostumbrado a programar en otros lenguajes, el código puede parecerle familiar, pero hay diferencias sutiles que es fácil que te pasen por alto.</p><p>Para declarar tu arreglo, sigue estos pasos:</p><ol><li>Dale un nombre a tu arreglo</li><li>Seguido a ese nombre de variable pon un signo igual. El signo igual <em><em>no debe</em></em> tener espacios a su alrededor.</li><li>Encierra el arreglo entre <em><em>paréntesis</em></em> (no corchetes como en JavaScript)</li><li>Escribe tus cadenas usando comillas, pero sin <em><em>comas</em></em> entre ellas</li></ol><p>Tu declaración de arreglo se verá así:</p><pre><code class="language-sh">miArreglo=("gato" "perro" "ratón" "rana")</code></pre><p>¡Eso es todo! Así de simple.</p><h2 id="c-mo-acceder-a-un-arreglo-en-bash"><strong>Cómo acceder a un </strong>arreglo<strong> en Bash</strong></h2><p>Hay un par de formas diferentes de recorrer tu arreglo. Puedes recorrer los elementos mismos o recorrer los índices.</p><h3 id="c-mo-hacer-un-bucle-a-trav-s-de-los-elementos-de-un-arreglo"><strong>Cómo hacer un bucle a través de los elementos de un </strong>arreglo</h3><p>Para recorrer los elementos del arreglo, tu código debe verse así:</p><pre><code class="language-sh">for str in ${miArreglo[@]}; do
  echo $str
done</code></pre><p>Para desglosarlo: Es algo así como usar <code>forEach</code> en JavaScript. Para cada cadena (str) en el arreglo (miArreglo), imprime esa cadena.</p><p>La salida de este bucle se ve así:</p><pre><code>gato
perro
ratón
rana</code></pre><p><strong><strong>Nota</strong></strong>: El símbolo <code>@</code> entre corchetes indica que está recorriendo <em><em>todos</em></em> los elementos del arreglo. Si tuvieras que omitir eso y simplemente escribir <code>for str in ${miArray}</code>, solo se imprimiría la primera cadena de caracteres del arreglo.</p><h3 id="c-mo-hacer-un-bucle-a-trav-s-de-ndices-del-arreglo"><strong>Cómo hacer un bucle a través de índices del </strong>arreglo</h3><p>Alternativamente, puedes recorrer los índices del arreglo. Esto es como un bucle <code>for</code> &nbsp;en JavaScript, y es útil cuando deseas poder acceder al índice de cada elemento.</p><p>Para usar este método, tu código deberá tener un aspecto similar al siguiente:</p><pre><code class="language-sh">for i in ${!miArreglo[@]}; do
  echo "El elemento $i es ${miArreglo[$i]}"
done</code></pre><p>La salida se verá así:</p><pre><code>El elemento 0 es gato
El elemento 1 es perro
El elemento 2 es ratón
El elemento 3 es rana</code></pre><p><strong><strong>Nota</strong></strong>: El signo de exclamación al comienzo de la variable <code>miArreglo</code> indica que está accediendo a los <em><em>índices</em></em> del arreglo y no a los elementos en sí. Esto puede ser confuso si estás acostumbrado al signo de exclamación que indica negación, así que presta mucha atención a eso.</p><p><strong><strong>Otra nota</strong></strong>: Bash normalmente no requiere llaves para las variables, pero sí para los arreglos. Entonces verás que cuando hace referencia a un arreglo, lo hace con la sintaxis <code>${miArreglo}</code>, pero cuando hace referencia a una cadena o número, simplemente usa un signo de dólar: <code>$i</code>.</p><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Los scripts de Bash son útiles para crear un comportamiento de línea de comandos automatizado, y los arreglos son una gran herramienta que puedes usar para almacenar múltiples datos.</p><p>Declararlos y usarlos no es difícil, pero es diferente a otros lenguajes, así que presta mucha atención para no cometer errores.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
