<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Terminal | Infinitos Contrastes</title><link>https://imalexissaez.github.io/tags/terminal/</link><atom:link href="https://imalexissaez.github.io/tags/terminal/index.xml" rel="self" type="application/rss+xml"/><description>Terminal</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>es</language><lastBuildDate>Mon, 05 Jun 2023 00:00:00 +0000</lastBuildDate><image><url>https://imalexissaez.github.io/media/icon_hu_f9a010db42001f4b.png</url><title>Terminal</title><link>https://imalexissaez.github.io/tags/terminal/</link></image><item><title>Curso de comandos de Linux</title><link>https://imalexissaez.github.io/blog/curso-de-comandos-de-linux/</link><pubDate>Mon, 05 Jun 2023 00:00:00 +0000</pubDate><guid>https://imalexissaez.github.io/blog/curso-de-comandos-de-linux/</guid><description>&lt;h3 id="1-introducción"&gt;1. Introducción&lt;/h3&gt;
&lt;p&gt;Esta semana he estado echando un vistazo a la plataforma
y más concretamente a su
curso de fundamentos,
.
Este es el punto de partida común que comparten las dos especializaciones de
desarrollo web ofrecidas en este sitio: una basada en &lt;strong&gt;Ruby&lt;/strong&gt; y otra en
&lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Su primera sección, &amp;lsquo;&amp;lsquo;Introduction&amp;rsquo;&amp;rsquo;, es ciertamente interesante, pues trata
temas tan variados como el aprendizaje en sí, la gestión de la frustración o la
manera de realizar preguntas adecuadamente para obtener ayuda útil. Es un
aspecto que la mayoría de los cursos no aborda y los recursos que ofrece esta
plataforma son muy interesantes.&lt;/p&gt;
&lt;p&gt;Completada dicha sección, la siguiente lleva por título &amp;lsquo;&amp;lsquo;Prerequisites&amp;rsquo;&amp;rsquo; y se
centra en el funcionamiento básico de los ordenadores y de Internet. Además, es
donde empezamos a configurar nuestro entorno de desarrollo para trabajar a lo
largo de este curso. Como no podía ser de otra manera, sin ni tan siquiera haber
generado un solo fichero, ya comienzan a aparecer los retos (que, por otra
parte, bienvenidos sean tras las conclusiones que se extraen de las charlas que
figuran en la sección &amp;lsquo;&amp;lsquo;Introduction&amp;rsquo;&amp;rsquo;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Odin Project&lt;/strong&gt; no da soporte oficial para Windows. ¿Qué sistema
operativo utiliza un servidor? Efectivamente, Windows. No obstante, la
plataforma no nos deja de lado y ofrece alternativas muy bien detalladas para
seguir los contenidos de la especialización. A la hora de escribir estas
líneas, estoy probando la emulación de una distribución de Linux, &lt;strong&gt;Xubuntu&lt;/strong&gt;,
a través de &lt;strong&gt;Oracle VM VirtualBox&lt;/strong&gt; (he tenido hasta que trastear la BIOS
para permitir la emulación en mi ordenador).&lt;/li&gt;
&lt;li&gt;La propia plataforma nos aconseja no caer en &amp;lsquo;&amp;lsquo;rabbit holes&amp;rsquo;&amp;rsquo; que nos
distraigan y centrarnos en seguir sus contenidos. La misma plataforma, casi en
cada uno de sus apartados, nos enseña docenas de tentadores &amp;lsquo;&amp;lsquo;rabbit holes&amp;rsquo;&amp;rsquo;
en los que perdernos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De hecho, esta serie de artículos para el blog son fruto de haber caído en uno
de ellos, pues una vez instalado Xubuntu recomiendan aprender los principales
comandos que se emplean en su terminal. Para ello enlazan a una lista de
reproducción en YouTube de 24 vídeos del canal
.&lt;/p&gt;
&lt;p&gt;A continuación, comparto las notas tomadas durante el cuarto vídeo, que
corresponde al primero del curso en el cual se empieza a utilizar la terminal.&lt;/p&gt;
&lt;h3 id="2-navegando-por-el-sistema-de-ficheros"&gt;2. Navegando por el sistema de ficheros&lt;/h3&gt;
&lt;p&gt;Para empezar, el comando &lt;code&gt;ls&lt;/code&gt; muestra el contenido del directorio actual de
trabajo (&lt;code&gt;ls&lt;/code&gt; es la abreviatura de &amp;lsquo;&amp;rsquo;list storage&amp;rsquo;&amp;rsquo;). Así, al iniciar una nueva
terminal, accederíamos con él a los contenidos de la carpeta del usuario.&lt;/p&gt;
&lt;p&gt;Si tecleamos &lt;code&gt;ls /&lt;/code&gt; accedemos a los contenidos almacenados en la raíz del
sistema (&lt;code&gt;/&lt;/code&gt;). Asimismo, con &lt;code&gt;ls /home&lt;/code&gt; se muestran las carpetas habilitadas
para los distintos usuarios del sistema. En mi caso, tras la instalación de
Xubuntu siguiendo las instrucciones de la plataforma, únicamente aparece la
carpeta &lt;code&gt;alexis&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Por comodidad, para limpiar la terminal y dejar de mostrar la información
acumulada hasta el momento, podemos emplear el comando &lt;code&gt;clear&lt;/code&gt; o, en ocasiones,
dependiendo de la distribución de Linux que tengamos en nuestro sistema, la
combinación de teclas &lt;code&gt;Ctrl + L&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Por otra parte, podemos añadir atributos a un comando de la terminal. Por
ejemplo, si tecleamos &lt;code&gt;ls -l /&lt;/code&gt; obtendremos mucha más información que antes de
cada una de las carpetas y de los ficheros ubicados en la raíz del sistema (el
atributo &lt;code&gt;-l&lt;/code&gt; indica &amp;lsquo;&amp;rsquo;long listing&amp;rsquo;&amp;rsquo;). Además, cada carpeta o fichero aparece
en su propia línea. Al inicio de cada una de las mencionadas líneas aparece una
extraña secuencia de caracteres que, en su mayor parte, recoge los permisos
asociados a la correspondiente carpeta o archivo. De momento, si nos centramos
únicamente en el primer carácter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt;: indica directorio o carpeta.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&lt;/code&gt;: indica que es un archivo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;l&lt;/code&gt;: indica un enlace a otro archivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una alternativa a la combinación &lt;code&gt;ls -l&lt;/code&gt; es el comando &lt;code&gt;ll&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En la raíz del sistema encontramos algunos directorios de vital importancia.
Aunque de momento no entraremos en profundidad en los detalles de cada uno de
ellos, para hacernos una idea resulta que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bin&lt;/code&gt;: es el directorio que contiene los programas ejecutables del sistema.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;boot&lt;/code&gt;: es el directorio que contiene los archivos necesarios para iniciar el
sistema operativo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;home&lt;/code&gt;: es el directorio asociado a los usuarios del sistema.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;etc&lt;/code&gt;: es el directorio que contiene los archivos de configuración del
sistema.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;media&lt;/code&gt;: es el directorio donde se montan dispositivos externos (usb,
cd-rom&amp;hellip;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;var&lt;/code&gt;: es el directorio que contiene &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; del sistema.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La terminal de algunas distribuciones de Linux emplea un código de colores para
diferenciar los distintos tipos de elementos almacenados. Así, el color azul
suele indicar carpetas; el blanco, archivos; y el verde, archivos binarios.&lt;/p&gt;
&lt;p&gt;Para cambiar de directorio y navegar por el sistema de archivos utilizamos el
comando &lt;code&gt;cd&lt;/code&gt;, que es la abreviatura de &amp;lsquo;&amp;lsquo;change directory&amp;rsquo;&amp;rsquo;. Por ejemplo, &lt;code&gt;cd /&lt;/code&gt;
nos lleva a la raíz del sistema y combinando los comandos &lt;code&gt;cd&lt;/code&gt; y &lt;code&gt;ls&lt;/code&gt; es como
habitualmente nos desplazaremos por el interior del sistema de archivos. En
cualquier momento podemos acceder a la ruta del directorio actual de trabajo en
el que nos encontramos sin más que teclear &lt;code&gt;pwd&lt;/code&gt;, que es la abreviatura de
&amp;lsquo;&amp;lsquo;print working directory&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;La tilde o virgulilla, &lt;code&gt;~&lt;/code&gt;, actúa como atajo hacia la carpeta del usuario. Así,
con &lt;code&gt;cd ~&lt;/code&gt; acudimos directamente a nuestra carpeta de usuario.&lt;/p&gt;
&lt;h3 id="3-edición-básica-de-archivos"&gt;3. Edición básica de archivos&lt;/h3&gt;
&lt;p&gt;Para empezar, creamos un archivo mediante el comando &lt;code&gt;touch&lt;/code&gt;, al que pasamos
como argumento el nombre deseado para el mencionado archivo. Por ejemplo, para
generar un fichero denominado &lt;code&gt;testfile.txt&lt;/code&gt; tecleamos &lt;code&gt;touch testfile.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Acto seguido, si escribimos &lt;code&gt;ls -l&lt;/code&gt;, observamos que un nuevo archivo aparece en
el listado, cuyo tamaño es &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ahora, para acceder al contenido de un archivo, empleamos el comando &lt;code&gt;cat&lt;/code&gt;. Por
ejemplo, en el caso del fichero que acabamos de generar, teclearíamos
&lt;code&gt;cat testfile.txt&lt;/code&gt;, aunque, al estar vacío, la terminal no arroja información
alguna cuando ejecutamos el anterior comando. Por otro lado, si tecleamos de
nuevo &lt;code&gt;touch testfile.txt&lt;/code&gt;, se actualizará la fecha de creación del fichero.&lt;/p&gt;
&lt;p&gt;Cambiando de tercio, podemos editar archivos empleando el comando &lt;code&gt;nano&lt;/code&gt;, que
nos da acceso a un editor de texto plano. Si lo iniciamos de esta manera, no
estaremos modificando ningún archivo (basta observar que en la parte superior
aparece &lt;code&gt;New Buffer&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;En la parte inferior de la aplicación figura el menú con todas sus opciones. El
símbolo &lt;code&gt;^&lt;/code&gt;, que aparece en todas ellas, ha de ser interpretado como el uso de
la tecla &lt;code&gt;Ctrl&lt;/code&gt;. Así, el atajo &lt;code&gt;^X&lt;/code&gt;, para salir del programa, ha de ser
ejecutado mediante la combinación &lt;code&gt;Ctrl + X&lt;/code&gt;. Asimismo, para guardar (o salvar)
un archivo tras escribir cierto texto, el atajo es &lt;code&gt;^O&lt;/code&gt;, que equivale a la
combinación &lt;code&gt;Ctrl + O&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si cerramos el editor de texto y ejecutamos &lt;code&gt;ls -l&lt;/code&gt;, observaremos que aparece el
nuevo archivo y este, a diferencia del anterior, posee cierto tamaño y podemos
revisar sus contenidos mediante el comando &lt;code&gt;cat&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Al comando &lt;code&gt;nano&lt;/code&gt; le podemos añadir un atributo con el nombre del fichero que
queremos editar. Por ejemplo, &lt;code&gt;nano test3.txt&lt;/code&gt;. Este archivo no existía en el
directorio actual, de manera que cuando salvemos lo creará con los contenidos
que hayamos escrito. Siguiendo esta lógica, podríamos editar el archivo
&lt;code&gt;testfile.txt&lt;/code&gt; que generamos al principio de la sección tecleando
&lt;code&gt;nano testfile.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La terminal posee autocompletado a través de la tecla &lt;code&gt;Tab&lt;/code&gt;. Así, escribiendo el
principio del nombre de un archivo o directorio y pulsando dicha tecla, se
autocompleta la línea.&lt;/p&gt;
&lt;p&gt;Con el comando &lt;code&gt;which&lt;/code&gt; podemos saber si una instrucción está disponible para su
uso en la terminal. Por ejemplo, &lt;code&gt;which nano&lt;/code&gt; nos devuelve la ruta hacia el
ejecutable, mientras que &lt;code&gt;which prueba&lt;/code&gt; no muestra salida, es decir, no existe
ningún comando o aplicación en mi sistema con el nombre &lt;code&gt;prueba&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="4-una-breve-mirada-a-vim"&gt;4. Una breve mirada a Vim&lt;/h3&gt;
&lt;p&gt;Un editor de texto plano muy completo es &lt;strong&gt;Vim&lt;/strong&gt; y, por tanto, es recomendable
aprender su uso. Quizá no a corto plazo, dada su elevada curva de aprendizaje;
pero por sus muchos beneficios merece la pena invertir un tiempo a medio plazo
para dominar esta aplicación si continuamos por la senda de la programación.&lt;/p&gt;
&lt;p&gt;En mi caso particular, al teclear en la terminal &lt;code&gt;which vim&lt;/code&gt;, esta no arroja
respuesta alguna. Es decir, la mencionada aplicación no está instalada en mi
sistema. Para solventar esta situación, basta teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install vim-nox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vim, como ya hemos mencionado, es un editor de texto plano más avanzado que
&lt;code&gt;nano&lt;/code&gt;, por lo que su uso es más complejo. Para empezar, salir de la propia
aplicación no es nada intuitivo y lo haremos tecleando &lt;code&gt;:q&lt;/code&gt; en el modo
&amp;lsquo;&amp;lsquo;command&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Así pues, ya apreciamos que existen diversos modos o estados en Vim. Por
ejemplo, pulsando la tecla &lt;code&gt;i&lt;/code&gt; activamos el modo &amp;lsquo;&amp;lsquo;insert&amp;rsquo;&amp;rsquo; (mediante el cual
podemos editar un archivo de la manera habitual) y con la tecla &lt;code&gt;Esc&lt;/code&gt;
retrocederíamos de nuevo al modo &amp;lsquo;&amp;lsquo;command&amp;rsquo;&amp;rsquo;. En este último modo, no podemos
escribir como habitualmente estamos acostumbrados, sino que es el modo que
empleamos en Vim para introducir instrucciones o comandos al programa.&lt;/p&gt;
&lt;p&gt;De esta forma, para salvar el archivo que hemos escrito a través del modo
&amp;lsquo;&amp;lsquo;insert&amp;rsquo;&amp;rsquo;, volvemos al modo &amp;lsquo;&amp;lsquo;command&amp;rsquo;&amp;rsquo; y escribimos &lt;code&gt;:w&lt;/code&gt; (si pulsamos intro a
continuación, recibiremos un error por no asignar un nombre al archivo). Así,
tecleamos &lt;code&gt;:w test4.txt&lt;/code&gt;. Al igual que sucedía con &lt;code&gt;nano&lt;/code&gt;, podemos lanzar Vim
con el nombre de un archivo como atributo, de manera que abrirá dicho fichero al
iniciarse.&lt;/p&gt;
&lt;p&gt;El atajo &lt;code&gt;shift + I&lt;/code&gt; es muy útil, pues activa el modo &amp;lsquo;&amp;lsquo;insert&amp;rsquo;&amp;rsquo; y coloca el
cursor al final del archivo.&lt;/p&gt;
&lt;p&gt;Si usamos &lt;code&gt;vim test4.txt&lt;/code&gt; y añadimos texto, bastará en el modo &amp;lsquo;&amp;lsquo;command&amp;rsquo;&amp;rsquo;
teclear para &lt;code&gt;:w&lt;/code&gt; para guardar el archivo (pues ya posee nombre asignado).&lt;/p&gt;
&lt;p&gt;Para borrar una línea por completo, podemos emplear el atajo que consiste en
pulsar &lt;code&gt;d&lt;/code&gt; dos veces en el modo &amp;lsquo;&amp;lsquo;command&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;h3 id="5-moviendo-y-renombrando-archivos"&gt;5. Moviendo y renombrando archivos&lt;/h3&gt;
&lt;p&gt;Para empezar, de cara a copiar un archivo usamos el comando &lt;code&gt;cp&lt;/code&gt;, que posee dos
argumentos: el archivo a copiar y el nombre del nuevo archivo donde será
copiado. Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp test2.txt newfile.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora, con el comando &lt;code&gt;cat&lt;/code&gt; podemos comprobar que el contenido de ambos archivos
es exactamente el mismo. No obstante, existe otro comando más apropiado para
llevar a cabo esta tarea de comparación: &lt;code&gt;diff&lt;/code&gt;, que nos indica en qué difieren
dos archivos. Así,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diff newfile.text test2.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No arroja salida alguna, es decir, no hay ninguna diferencia entre ambos
archivos. Sin embargo,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diff newfile.text test3.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sí arroja resultados, pues son ficheros cuyos contenidos difieren.&lt;/p&gt;
&lt;p&gt;Por otra parte, de cara a borrar un archivo, el comando a usar es &lt;code&gt;rm&lt;/code&gt;. Por
ejemplo&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm newfile.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este comando también elimina directorios (con el atributo &lt;code&gt;-r&lt;/code&gt; que activa la
recursión), por lo que hemos de ser cautos cuando lo empleamos. Esta instrucción
no mueve el archivo a una suerte de &amp;lsquo;&amp;lsquo;Papelera de reciclaje&amp;rsquo;&amp;rsquo; como en Windows,
sino que lo elimina por completo del sistema. Si después lo queremos recuperar
tendríamos que usar herramientas específicas de recuperación de archivos en
memoria.&lt;/p&gt;
&lt;p&gt;A continuación, antes de aprender a mover archivos, creemos un nuevo directorio,
con el comando &lt;code&gt;mkdir&lt;/code&gt; para almacenarlos. Por ejemplo&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir linux-notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora, para mover los archivos, el comando a emplear es &lt;code&gt;mv&lt;/code&gt; cuyo primer
argumento será el nombre del archivo a mover y el segundo su destino.&lt;/p&gt;
&lt;p&gt;Podemos emplear &amp;lsquo;&amp;lsquo;comodines&amp;rsquo;&amp;rsquo; en las instrucciones de la terminal para algunos
comandos. Por ejemplo, &lt;code&gt;*.txt&lt;/code&gt; se traduce en todos los archivos cuya extensión
sea &lt;code&gt;.txt&lt;/code&gt;. De esta manera, podemos mover en bloque todos los ficheros de prueba
que hemos creado hasta el momento.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv *.txt linux-notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Recordemos que con el comando &lt;code&gt;cd&lt;/code&gt; cambiamos el directorio y si tecleamos
&lt;code&gt;cd ..&lt;/code&gt; volvemos un paso atrás en la ruta (o a un nivel inferior). Así,
siguiendo la misma lógica, si queremos mover un paso atrás en la ruta alguno de
los archivos, basta escribir&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; linux-notes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv testfile.txt ..
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Además, hemos de tener en cuenta que si &lt;code&gt;..&lt;/code&gt; indica un nivel inferior, &lt;code&gt;.&lt;/code&gt;
indica el nivel actual (el directorio de trabajo). Esto nos permite usar el
comando &lt;code&gt;mv&lt;/code&gt; para mover archivos hacia la actual ruta donde nos encontremos. Por
ejemplo, para traer de vuelta el archivo &lt;code&gt;testfile.txt&lt;/code&gt; al directorio
&lt;code&gt;linux-notes&lt;/code&gt;, bastaría teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; linux-notes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;md ../testfile.txt .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente, de cara a renombrar archivos, empleamos el mismo comando que para
moverlos. Por ejemplo&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv test3.txt abc.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con este comando también hemos de ser cautos para no renombrar un archivo con el
nombre de un fichero existente, pues podemos sobrescribirlo. En algunas
distribuciones de Linux esto sucede directamente (Xubuntu es un ejemplo de esta
forma de proceder) y en otras pregunta si deseamos realizar dicha acción.&lt;/p&gt;
&lt;h3 id="6-configurando-la-terminal"&gt;6. Configurando la terminal&lt;/h3&gt;
&lt;p&gt;En esta sección nos adentraremos en la configuración de la terminal (Bash por
defecto en la mayoría de las distribuciones de Linux). Para ello, hemos de ser
conscientes de la existencia de archivos escondidos (&amp;lsquo;&amp;lsquo;hidden files&amp;rsquo;&amp;rsquo;) en
nuestro sistema operativo, que no se muestran por defecto al listar los
contenidos de un directorio mediante el comando &lt;code&gt;ls&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para que dicho listado incluya los mencionados ficheros escondidos, tecleamos
&lt;code&gt;ls -a&lt;/code&gt;. Los archivos que aparecen con un punto delante de su nombre son los
ficheros escondidos a los que hacíamos referencia antes y que no se listan por
defecto al emplear el comando &lt;code&gt;ls&lt;/code&gt; sin atributos.&lt;/p&gt;
&lt;p&gt;Podemos encadenar atributos en un comando de una manera bastante cómoda. Por
ejemplo, teclear &lt;code&gt;ls -la&lt;/code&gt; tiene el efecto de añadir los atributos &lt;code&gt;-l&lt;/code&gt; y &lt;code&gt;-a&lt;/code&gt; al
comando &lt;code&gt;ls&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Así pues, si ejecutamos &lt;code&gt;ls -la&lt;/code&gt; en la carpeta &lt;code&gt;/home&lt;/code&gt; y observamos el principio
de largo listado que aparece, nos daremos cuenta de la existencia de un archivo
denominado &lt;code&gt;.bashrc&lt;/code&gt;. Utilizando &lt;code&gt;nano .bashrc&lt;/code&gt; podemos acceder a su contenido.
Las líneas que comienzan con el símbolo &lt;code&gt;#&lt;/code&gt; son comentarios. Por otra parte,
hemos de llevar cuidado de realizar modificaciones en este archivo y luego
sobrescribir, pues las consecuencias pueden distar de ser deseables.&lt;/p&gt;
&lt;p&gt;En caso de realizar alguna modificación con catastróficas consecuencias, podemos
recuperar una especie de configuración por defecto en &lt;code&gt;/etc/skel/.bashrc&lt;/code&gt;. La
carpeta &lt;code&gt;skel&lt;/code&gt; `contiene ciertos ficheros de configuración por defecto para
asignarlos cuando creamos un nuevo usuario en el sistema. Por otro lado, si en
Google buscamos &amp;lsquo;&amp;lsquo;Xubuntu .bashrc&amp;rsquo;&amp;rsquo;, el primer resultado contiene las líneas de
la configuración por defecto de la terminal en Xubuntu.&lt;/p&gt;
&lt;p&gt;En esta lección únicamente nos vamos a limitar a crear un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo;. Para ello,
añadimos al archivo la línea:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;clear
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Guardamos el fichero (con &lt;code&gt;Ctrl + O&lt;/code&gt;, como indica en el menú inferior) y ahora,
en la terminal, no es necesario escribir &lt;code&gt;clear&lt;/code&gt; para limpiar la pantalla. Basta
con teclear &lt;code&gt;c&lt;/code&gt; y pulsar intro.&lt;/p&gt;
&lt;p&gt;En mi caso, ha sido necesario reiniciar la terminal para que el cambio tuviera
efecto.&lt;/p&gt;
&lt;p&gt;Así, al abrir la terminal, esta accede al archivo de su configuración y tiene en
cuenta las instrucciones allí declaradas. Si en un futuro hemos de realizar
modificaciones al comportamiento de esta herramienta, seguramente lo hagamos a
través de este archivo de configuración.&lt;/p&gt;
&lt;h3 id="7-el-archivo-bashrc-original"&gt;7. El archivo &lt;code&gt;.bashrc&lt;/code&gt; original&lt;/h3&gt;
&lt;p&gt;Como temo que fruto de experimentar con este archivo surja alguna consecuencia
desastrosa, dejo a continuación una copia del contenido original del mismo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.bashrc: executed by bash(1) for non-login shells.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# for examples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# If not running interactively, don&amp;#39;t do anything&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$-&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *i*&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# don&amp;#39;t put duplicate lines or lines starting with space in the history.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# See bash(1) for more options&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HISTCONTROL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ignoreboth
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# append to the history file, don&amp;#39;t overwrite it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;shopt&lt;/span&gt; -s histappend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HISTSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HISTFILESIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# check the window size after each command and, if necessary,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# update the values of LINES and COLUMNS.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;shopt&lt;/span&gt; -s checkwinsize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# If set, the pattern &amp;#34;**&amp;#34; used in a pathname expansion context will&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# match all files and zero or more directories and subdirectories.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#shopt -s globstar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# make less more friendly for non-text input files, see lesspipe(1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; -x /usr/bin/lesspipe &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;SHELL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/bin/sh lesspipe&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# set variable identifying the chroot you work in (used in the prompt below)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;debian_chroot&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -r /etc/debian_chroot &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;debian_chroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat /etc/debian_chroot&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# set a fancy prompt (non-color, unless we know we &amp;#34;want&amp;#34; color)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TERM&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xterm-color&lt;span class="p"&gt;|&lt;/span&gt;*-256color&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;color_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# uncomment for a colored prompt, if the terminal has the capability; turned&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# off by default to not distract the user: the focus in a terminal window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# should be on the output of commands, not on the prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#force_color_prompt=yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$force_color_prompt&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -x /usr/bin/tput &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tput setaf &lt;span class="m"&gt;1&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# We have color support; assume it&amp;#39;s compliant with Ecma-48&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# (ISO/IEC-6429). (Lack of such support is extremely rare, and such&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# a case would tend to support setf rather than setaf.)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;color_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;color_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$color_prompt&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; yes &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;${debian_chroot:+($debian_chroot)}\u@\h:\w\$ &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;unset&lt;/span&gt; color_prompt force_color_prompt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# If this is an xterm set the title to user@host:dir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TERM&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xterm*&lt;span class="p"&gt;|&lt;/span&gt;rxvt*&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;\[\e]0;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;debian_chroot&lt;/span&gt;&lt;span class="p"&gt;:+(&lt;/span&gt;&lt;span class="nv"&gt;$debian_chroot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\u@\h: \w\a\]&lt;/span&gt;&lt;span class="nv"&gt;$PS1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# enable color support of ls and also add handy aliases&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -x /usr/bin/dircolors &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -r ~/.dircolors &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dircolors -b ~/.dircolors&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dircolors -b&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls --color=auto&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#alias dir=&amp;#39;dir --color=auto&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#alias vdir=&amp;#39;vdir --color=auto&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;grep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grep --color=auto&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;fgrep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fgrep --color=auto&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;egrep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;egrep --color=auto&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# colored GCC warnings and errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#export GCC_COLORS=&amp;#39;error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# some more ls aliases&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -alF&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;la&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -A&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;l&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -CF&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add an &amp;#34;alert&amp;#34; alias for long running commands. Use like so:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sleep 10; alert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;alert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;notify-send --urgency=low -i &amp;#34;$([ $? = 0 ] &amp;amp;&amp;amp; echo terminal || echo error)&amp;#34; &amp;#34;$(history|tail -n1|sed -e &amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/^\s*[0-9]\+\s*//;s/[;&amp;amp;|]\s*alert$//&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Alias definitions.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# You may want to put all your additions into a separate file like&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.bash_aliases, instead of adding them here directly.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# See /usr/share/doc/bash-doc/examples in the bash-doc package.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f ~/.bash_aliases &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; . ~/.bash_aliases
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# enable programmable completion features (you don&amp;#39;t need to enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# this, if it&amp;#39;s already enabled in /etc/bash.bashrc and /etc/profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sources /etc/bash.bashrc).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;shopt&lt;/span&gt; -oq posix&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f /usr/share/bash-completion/bash_completion &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; . /usr/share/bash-completion/bash_completion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f /etc/bash_completion &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; . /etc/bash_completion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="8-abordando-el-uso-de-alias"&gt;8. Abordando el uso de alias&lt;/h3&gt;
&lt;p&gt;Al final de la sección anterior, incluimos un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; en el archivo de
configuración de la terminal que nos permite limpiar esta tecleando únicamente
&lt;code&gt;c&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Así pues, un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; nos ofrece la posibilidad de crear nuevos comandos a
partir de los ya existentes. En la mayoría de los casos se busca automatizar
tareas cotidianas de una manera más corta o incluir ciertos atributos por
defecto cuando tecleamos la versión sin atributos de un determinado comando.&lt;/p&gt;
&lt;p&gt;Para tener acceso a un listado de los &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; disponibles en nuestra terminal,
basta teclear en ella &lt;code&gt;alias&lt;/code&gt;. En ella podemos apreciar que uno de los comandos
que examinamos en lecciones anteriores, &lt;code&gt;ll&lt;/code&gt;, no es más que un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; del
comando &lt;code&gt;ls&lt;/code&gt;, al que añade los atributos &lt;code&gt;-alF&lt;/code&gt;. De hecho, el propio comando
&lt;code&gt;ls&lt;/code&gt; es un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; de sí mismo configurando cierta opción para colorear.&lt;/p&gt;
&lt;p&gt;En mi caso, el anterior listado es reducido, ya que apenas cuenta con diez
líneas. Sin embargo, es posible acceder a la definición concreta de un
&amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo;, como el generado para la tecla &lt;code&gt;c&lt;/code&gt;, escribiendo &lt;code&gt;alias c&lt;/code&gt;. La
terminal devuelve &lt;code&gt;alias c='clear'&lt;/code&gt;. A medida que incorporemos más y más
&amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo;, puede resultar conveniente acceder a la definición concreta de uno de
ellos para disponer de todos sus detalles.&lt;/p&gt;
&lt;p&gt;Si en algún momento precisamos eliminar un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo;, simplemente hemos de
utilizar el comando &lt;code&gt;unalias&lt;/code&gt; declarando como argumento el atajo
correspondiente. Por ejemplo, &lt;code&gt;unalias c&lt;/code&gt; desactivaría la posibilidad de limpiar
la pantalla de la terminar utilizando únicamente la tecla &lt;code&gt;c&lt;/code&gt;. No obstante, como
dicho &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; está incluido en el archivo de configuración de la terminal,
cuando iniciemos una nueva sesión de esta, volverá a estar disponible el
&amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; asignado a la tecla &lt;code&gt;c&lt;/code&gt;. Para eliminarlo por completo, deberíamos
editar el mencionado archivo de configuración y suprimir la línea
correspondiente a la definición de dicho &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Cambiando de tercio, es posible que nos resulte útil conocer los cinco procesos
que más uso están haciendo de la CPU. El comando asociado a ello es un tanto
complejo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps auxf &lt;span class="p"&gt;|&lt;/span&gt; sort -nr -k &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De esta forma, si este es un dato que queremos consultar con cierta frecuencia,
tiene sentido definir un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; para el mismo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;cp5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ps auxf | sort -nr -k 3 | head -5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En realidad, el anterior &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; no es un comando, sino una composición de
comandos. Como podemos apreciar, usa el símbolo &lt;code&gt;|&lt;/code&gt; para redirigir los
resultados de un comando hacia el argumento de entrada para otro. En el ejemplo
anterior, se ejecuta el comando &lt;code&gt;ps&lt;/code&gt; con ciertos atributos, la salida del cual
se envía al comando &lt;code&gt;sort&lt;/code&gt; y esta al comando &lt;code&gt;head&lt;/code&gt; para producir el resultado
final que se muestra en la terminal.&lt;/p&gt;
&lt;p&gt;Así, para conocer el mismo dato, pero asociado al uso de la memoria, podemos
definir un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; que es ciertamente similar al anterior:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;mem5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ps auxf | sort -nr -k 4 | head -5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente, algunos &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; recomendados son&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;history&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;install&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sudo apt install&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aunque, como hemos visto arriba, si nos encontramos en una situación donde
habitualmente escribimos largos comandos o encadenamos siempre la misma
secuencia de comandos, es recomendable definir un &amp;lsquo;&amp;lsquo;alias&amp;rsquo;&amp;rsquo; que nos ahorre
tiempo.&lt;/p&gt;
&lt;h3 id="9-introducción-a-los-permisos-en-linux"&gt;9. Introducción a los permisos en Linux&lt;/h3&gt;
&lt;p&gt;Para empezar, la manera en que Linux gestiona los permisos es un tanto diferente
a la que lleva a cabo Windows. Por ejemplo, al teclear &lt;code&gt;ls -l&lt;/code&gt; en la terminal,
dentro de la carpeta de usuario (&lt;code&gt;cd ~&lt;/code&gt; para acceder a ella si estamos ubicados
en un directorio de trabajo distinto), para la carpeta &lt;code&gt;Desktop&lt;/code&gt; la línea
comienza con la secuencia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El primer carácter, &lt;code&gt;d&lt;/code&gt;, recordemos, indica que es un directorio. (&lt;code&gt;-&lt;/code&gt; para
archivos). El resto de los caracteres de la secuencia nos indica lo que podemos
hacer (o no) con el directorio o archivo en cuestión. Para interpretar dicha
secuencia de caracteres, hemos de dividirla en cuatro secciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sección 1: el primer carácter, que sabemos indica el tipo de elemento del que
se trata (archivo, directorio o enlace).&lt;/li&gt;
&lt;li&gt;Sección 2: los siguientes tres caracteres, que hacen referencia a los permisos
del usuario al que pertenece el archivo o directorio. Dicho usuario aparece en
la tercera columna del listado que genera el comando &lt;code&gt;ls -l&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sección 3: los siguientes tres caracteres, que hacen referencia a los permisos
del grupo al cual pertenece el archivo o directorio. Dicho grupo aparece en la
cuarta columna del listado que genera el comando &lt;code&gt;ls -l&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sección 4: los siguientes tres caracteres, que hacen referencia a los permisos
del resto de usuarios que ni son propietarios ni pertenecen al grupo en
cuestión (se denomina &amp;lsquo;&amp;lsquo;world&amp;rsquo;&amp;rsquo; en ocasiones a los usuarios a los que afecta
esta sección).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En cada una de las posiciones de las secciones 2, 3 y 4 encontramos una letra de
la secuencia &lt;code&gt;rwx&lt;/code&gt; o bien un guion, &lt;code&gt;-&lt;/code&gt;, que indica que el correspondiente
permiso no está disponible. El orden siempre es &lt;code&gt;rwx&lt;/code&gt; en dichas secciones, por
lo que una subsecuencia como &lt;code&gt;r-x&lt;/code&gt; indica la ausencia del permiso &lt;code&gt;w&lt;/code&gt; para ese
elemento en concreto en la sección asociada.&lt;/p&gt;
&lt;p&gt;Ahora bien, ¿qué significa cada una de las letras?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; es para &amp;lsquo;&amp;lsquo;read&amp;rsquo;&amp;rsquo;, esto es, es la letra asociada al permiso de lectura.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; es para &amp;lsquo;&amp;lsquo;write&amp;rsquo;&amp;rsquo;, esto es, es la letra asociada al permiso de escritura o
edición (incluso nos permitiría eliminar el elemento en concreto).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; es para &amp;lsquo;&amp;rsquo;execute&amp;rsquo;&amp;rsquo;, esto es, es la letra asociada al permiso de
ejecución. Está reservada para aquellos elementos en los que podemos insertar
comandos y ejecutarlos como si fueran programas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para editar permisos en un elemento, empleamos el comando &lt;code&gt;chmod&lt;/code&gt;. Por ejemplo,
si deseamos añadir el permiso de ejecución a un archivo denominado &lt;code&gt;test.txt&lt;/code&gt;,
escribiríamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al volver a ejecutar &lt;code&gt;ls -l&lt;/code&gt; observamos que el permiso &lt;code&gt;x&lt;/code&gt; está disponible para
el usuario, para el grupo y para el resto. Además, la terminal cambia su color a
verde, para indicar que ahora es un archivo ejecutable.&lt;/p&gt;
&lt;p&gt;Para devolver los permisos a su estado inicial, basta teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod -x test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Además, como cabría esperar, podemos configurar el permiso &lt;code&gt;x&lt;/code&gt; de manera que
afecte solo a una sección. Por ejemplo, para asignar únicamente al propietario
del archivo el permiso &lt;code&gt;x&lt;/code&gt; hemos de escribir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod u+x test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para habilitar todos los permisos en un elemento a cualquier usuario, hemos de
teclear &lt;code&gt;chmod a+rwx&lt;/code&gt;. Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod a+rwx test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No es una práctica recomendable para directorios o archivos que contengan
información sensible.&lt;/p&gt;
&lt;p&gt;Por otro lado, la letra correspondiente para el grupo es &lt;code&gt;g&lt;/code&gt;, de manera que si
deseo retirar todos los permisos al grupo tendría que teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod g-rwx test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta configuración tiene poco sentido, pues todo el mundo tiene los permisos
&lt;code&gt;rwx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finalmente, para hacer referencia al resto de usuarios que ni son propietarios,
ni pertenecen al grupo, la letra es &lt;code&gt;o&lt;/code&gt;. Así, para retirarlos los permisos &lt;code&gt;rwx&lt;/code&gt;
teclearíamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod o-rwx test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Acto seguido, devolvamos los permisos a su estado original:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod u-x test.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod g+rw test.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod o+r test.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cambiando de tercio, los permisos se gestionan de manera diferente si se trata
de archivos o de directorios. En el caso de los directorios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; nos permite visualizar su contenido.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; nos permite editar o modificar el directorio.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; nos permite acceder a su interior.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="10-examinando-el-uso-de-recursos-del-sistema"&gt;10. Examinando el uso de recursos del sistema&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos la gestión de recursos del sistema como, por
ejemplo, uso de memoria, uso de espacio en disco, etc. El primer comando que
analizaremos es &lt;code&gt;free&lt;/code&gt;. Este nos ofrece información relevante sobre el uso de
memoria del sistema. No obstante, por defecto, la ofrece en &amp;lsquo;&amp;lsquo;bytes&amp;rsquo;&amp;rsquo;,
comportamiento que podemos modificar haciendo uso del atributo &lt;code&gt;-m&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En mi caso, al estar la distribución de Xubuntu virtualizada, los datos
corresponden a los declarados en la configuración de la máquina virtual y no a
los correspondientes al ordenador en sí.&lt;/p&gt;
&lt;p&gt;Por otro lado, ¿cuál es la diferencia entre las columnas &amp;lsquo;&amp;lsquo;free&amp;rsquo;&amp;rsquo; y
&amp;lsquo;&amp;lsquo;available&amp;rsquo;&amp;rsquo;? El dato que aparece en la columna &amp;lsquo;&amp;lsquo;free&amp;rsquo;&amp;rsquo; está verdaderamente
libre de uso, mientras que &amp;lsquo;&amp;lsquo;available&amp;rsquo;&amp;rsquo; tiene en cuenta que algunas
aplicaciones reservan parte de la memoria para su uso y puede que actualmente no
estén haciendo uso de dicha reserva. Por ello este dato es más elevado, aunque,
según las necesidades de las aplicaciones, es bastante variable.&lt;/p&gt;
&lt;p&gt;A continuación, para analizar el espacio en disco usado, empleamos el comando
&lt;code&gt;df&lt;/code&gt; (abreviatura de &amp;lsquo;&amp;lsquo;disk free&amp;rsquo;&amp;rsquo;). Para una lectura más cómoda de los números
que aparecen en su salida, conviene agregar el atributo &lt;code&gt;-h&lt;/code&gt;, que transforma las
cantidades a &amp;lsquo;&amp;lsquo;megabytes&amp;rsquo;&amp;rsquo; o &amp;lsquo;&amp;lsquo;gigabytes&amp;rsquo;&amp;rsquo; según convenga.&lt;/p&gt;
&lt;p&gt;A modo anecdótico, el espacio en disco puede agotarse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cuando almacenamos demasiados elementos cuyo tamaño es considerable
(películas, videojuegos&amp;hellip;).&lt;/li&gt;
&lt;li&gt;Cuando almacenamos demasiados elementos, aunque su tamaño sea reducido. Cada
distribución tiene un límite a este respecto y viene dado por el concepto de
&lt;strong&gt;Inodes&lt;/strong&gt;. Para acceder al listado de &amp;lsquo;&amp;lsquo;Inodes&amp;rsquo;&amp;rsquo; disponibles, basta teclear
&lt;code&gt;df -i&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Acto seguido, otro comando de gran utilidad es &lt;code&gt;htop&lt;/code&gt;, que, en mi caso, no viene
instalado por defecto en Xubuntu. Así pues, para solventar esta situación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install htop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;htop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A primera vista, nos recuerda al administrador de tareas de Windows y nos ofrece
una cantidad enorme de información acerca de los recursos del sistema. Aún
siendo una herramienta que se ofrece en la línea de comandos, podemos emplear el
ratón para movernos por los diferentes menús disponibles.&lt;/p&gt;
&lt;p&gt;Desde esta herramienta podemos cerrar procesos haciendo uso de la combinación
&lt;code&gt;F9 + 15 SIGTERM&lt;/code&gt; o, de haber quedado la aplicación totalmente congelada, con
&lt;code&gt;F9 + 9 SIGKILL&lt;/code&gt;. Para cerrar, hacemos clic sobre la opción correspondiente o
simplemente pulsamos &lt;code&gt;F10&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finalmente, otro comando útil es &lt;code&gt;uptime&lt;/code&gt;, que indica cuánto tiempo lleva en
marcha la sesión actual y la carga media. Estos tres últimos valores no han de
ser interpretados como porcentajes, pues los ordenadores de hoy en día poseen
varios núcleos (un &lt;code&gt;0.12&lt;/code&gt; no equivale pues a un 12% de carga, a no ser que
nuestra máquina tenga un único núcleo). Además,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El primer valor hace referencia a la carga media durante el último minuto.&lt;/li&gt;
&lt;li&gt;El segundo valor es con respecto a los últimos cinco minutos.&lt;/li&gt;
&lt;li&gt;El tercer valor es con respecto a los últimos quince minutos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los valores hemos de interpretarlos como tareas a la espera de ser ejecutadas
por el sistema. Por ejemplo, &lt;code&gt;0,12&lt;/code&gt; indica que, de media, menos de una tarea
está en espera de ser ejecutada; es decir, el sistema está trabajando de manera
bastante desahogada.&lt;/p&gt;
&lt;p&gt;En otras palabras, y utilizando como analogía un supermercado, el número de
núcleos del ordenador haría las veces de cajeros, mientras que las tareas serían
los clientes a la espera de pagar sus compras. Si tenemos 2 núcleos y hay un
cliente, el sistema funcionará bien e incluso habrá un cajero que se estará
aburriendo en ese momento determinado. Con dos clientes todavía no encontramos
problema, pues cada cajero está atendiendo su tarea asociada. El problema es
cuando el número de clientes asciende, por ejemplo, a 20, pues los dos cajeros
no dan abasto y las colas serán largas. En este último caso, algunas de las
tareas del sistema tardarán en poder llevarse a cabo.&lt;/p&gt;
&lt;h3 id="11-gestionando-los-paquetes"&gt;11. Gestionando los paquetes&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos la instalación, eliminación y actualización de
paquetes en nuestro sistema.&lt;/p&gt;
&lt;p&gt;Los métodos que se describen a continuación están diseñados para distribuciones
basadas en &lt;strong&gt;Debian&lt;/strong&gt; o &lt;strong&gt;Ubuntu&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;El primer paso a llevar a cabo es la actualización de nuestro índice local de
paquetes disponibles en el repositorio, es decir, en el servidor online desde el
cual los descargaremos. Para ello, tecleamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En mi caso concreto, la mayoría de servidores con los que conecta son de Ubuntu,
pero también observamos que aparece alguno de Google o de Microsoft.&lt;/p&gt;
&lt;p&gt;A continuación, una vez actualizado el índice de paquetes, podemos buscar
paquetes concretos en él desde la propia línea de comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt search firefox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En esta ocasión no necesitamos anteceder el comando con &lt;code&gt;sudo&lt;/code&gt;, pues no vamos a
realizar cambios en el sistema. Cuando queramos instalar un paquete, por
ejemplo, sí será necesario incluir ese comando en la sentencia.&lt;/p&gt;
&lt;p&gt;El listado es bastante extenso en este ejemplo concreto, pues muestra todos los
paquetes relacionados con Firefox (desde idiomas a extensiones, pasando por el
propio navegador en sí).&lt;/p&gt;
&lt;p&gt;Para instalar un paquete concreto, la instrucción es &lt;code&gt;sudo apt install&lt;/code&gt; seguida
el nombre del paquete a instalar. Por ejemplo, para instalar el editor de texto
plano Vim escribimos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install vim-nox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como ejemplo más práctico, instalemos a continuación
, que es un servidor
web que utilizamos a diario:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt search apache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A la hora de instalar este paquete, el comando &lt;code&gt;apt&lt;/code&gt; se encarga de gestionar sus
dependencias, de manera que nos indica qué paquetes adicionales son necesarios
para realizar la instalación del que nos interesa. Como esta operación implica
llevar a cabo más cambios de los que indicamos desde la línea de comandos, la
instalación se detiene y espera a que el usuario confirme si realmente desea
instalar tanto el paquete indicado como sus correspondientes dependencias.&lt;/p&gt;
&lt;p&gt;Además de las dependencias, &lt;code&gt;apt&lt;/code&gt; recomienda la instalación de paquetes
adicionales por su utilidad, aunque no fuerza a su instalación y deberíamos
llevar a cabo el proceso después de manera manual.&lt;/p&gt;
&lt;p&gt;Una vez instalado Apache, si escribimos en la barra de direcciones de Chrome (o
cualquier navegador), &lt;code&gt;localhost&lt;/code&gt; nos aparecerá la página por defecto de Apache.&lt;/p&gt;
&lt;p&gt;Por otro lado, para eliminar un paquete del sistema, la instrucción es
&lt;code&gt;sudo apt remove&lt;/code&gt; seguida el nombre del paquete a eliminar. Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt remove apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por defecto, no elimina las dependencias asociadas a Apache. Para solventar la
situación tecleamos &lt;code&gt;sudo apt autoremove&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Acto seguido, actualicemos los paquetes que tenemos instalados en nuestro
sistema. En mi caso, desde que iniciamos la lección, la terminal me ha indicado
cada vez que poseo 21 paquetes que no están actualizados. Para ello tecleamos&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt dist-upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La última instrucción conviene ejecutarla cuando hayan quedado paquetes a
eliminar o haya algunos que deban instalarse por primera vez, pues
&lt;code&gt;sudo apt upgrade&lt;/code&gt; no realiza estas labores por defecto.&lt;/p&gt;
&lt;p&gt;Por cuestiones de seguridad, conviene actualizar los paquetes con frecuencia.&lt;/p&gt;
&lt;p&gt;Finalmente, en el caso que se hayan realizado actualizaciones del &amp;lsquo;&amp;lsquo;kernel&amp;rsquo;&amp;rsquo;,
conviene reiniciar el sistema, para lo cual escribimos &lt;code&gt;sudo reboot&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="12-gestionando-procesos-en-linux"&gt;12. Gestionando procesos en Linux&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos cómo gestionar procesos en Linux. Estudiaremos el
comando &lt;code&gt;systemctl&lt;/code&gt;, que permite iniciar, detener y reiniciar servicios que se
ejecutan en segundo plano (que habitualmente reciben el nombre de &amp;lsquo;&amp;lsquo;units&amp;rsquo;&amp;rsquo;).&lt;/p&gt;
&lt;p&gt;Comencemos instalando de nuevo Apache, que nos servirá de base para los ejemplos
de esta lección:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Recordemos que si ahora abrimos el navegador y escribimos en la barra de
direcciones &lt;code&gt;localhost&lt;/code&gt;, accederemos a la página por defecto de Apache. Esto es
posible debido a que se ejecuta en segundo plano, como podemos comprobar si
tecleamos en la terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aparece &lt;code&gt;enabled&lt;/code&gt; en la fila correspondiente a &lt;code&gt;Loaded:&lt;/code&gt;, esto es, cuando
iniciemos el sistema, Apache automáticamente se iniciará. Además, es el
comportamiento que viene predefinido al instalar este paquete, pues así está
declarado en &lt;code&gt;vendor preset&lt;/code&gt;, con un valor asimismo de &lt;code&gt;enabled&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Estas características son las responsables de que una vez hayamos instalado el
paquete, hayamos podido acceder a la página por defecto de Apache en el
navegador sin tener que iniciar proceso alguno para ello.&lt;/p&gt;
&lt;p&gt;En la línea encabezada por &lt;code&gt;Active:&lt;/code&gt; observamos que está activo el proceso y en
funcionamiento, indicándonos desde cuándo.&lt;/p&gt;
&lt;p&gt;Por otro lado, en la parte final deberíamos haber tenido acceso a cierta
información (&amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo;), pero en mi distribución no aparece por defecto. Para
visualizar los &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; hemos de anteceder el anterior comando con &lt;code&gt;sudo&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos desactivar Apache sin más que teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sin embargo, si ahora ejecutamos &lt;code&gt;systemctl status apache2&lt;/code&gt;, observamos que el
proceso sigue en funcionamiento (&lt;code&gt;active (running)&lt;/code&gt;), pero en la línea
encabezada con &lt;code&gt;Loaded:&lt;/code&gt; ahora aparece &lt;code&gt;disabled&lt;/code&gt;, lo cual indica que la próxima
vez que iniciemos el sistema, Apache no se iniciará de manera automática.&lt;/p&gt;
&lt;p&gt;Para detener el proceso, hemos de teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop apache2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora podemos observar como en la línea encabezada por &lt;code&gt;Active:&lt;/code&gt; figura
&lt;code&gt;inactive (dead)&lt;/code&gt;. De hecho, si refrescamos la página del navegador aparece un
error en la misma.&lt;/p&gt;
&lt;p&gt;A continuación, restauremos el comportamiento por defecto de Apache. Para
empezar, asegurémosnos que arranca automáticamente la próxima vez que iniciemos
el sistema. Para ello:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; apache2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Así, comprobamos que vuelve a aparecer &lt;code&gt;enabled&lt;/code&gt; en la línea encabezada por
&lt;code&gt;Loaded:&lt;/code&gt;. Ahora, iniciamos el proceso sin más que teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start apache2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De manera que todo vuelve a funcionar como al principio de la lección.&lt;/p&gt;
&lt;p&gt;Finalmente, para reiniciar un proceso, hemos de escribir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De forma que comprobamos que se ha reiniciado el proceso observando desde cuándo
está activo.&lt;/p&gt;
&lt;h3 id="13-revisando-logs"&gt;13. Revisando &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo;&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos la gestión de &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo;, a los que recurriremos
habitualmente para examinar la información que recopilen nuestras aplicaciones
(errores, acciones&amp;hellip;).&lt;/p&gt;
&lt;p&gt;A la hora de trabajar con &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; es posible que necesitemos privilegios de
administrador (&lt;strong&gt;root&lt;/strong&gt;) para revisar algunos de ellos, por lo que quizá nos
veamos forzados a emplear el comando &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Empecemos revisando &lt;code&gt;syslog&lt;/code&gt;, que contiene una enorme cantidad de información
que el sistema va almacenando en dicho archivo. Para ello, emplearemos el
comando &lt;code&gt;cat&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cat /var/log/syslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;¿Qué más &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; tenemos a nuestra disposición?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/log/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A modo de curiosidad, el sistema gestiona &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; como &lt;code&gt;syslog&lt;/code&gt; de manera
inteligente, rotándolos y comprimiéndolos para que ocupen el menor espacio
posible.&lt;/p&gt;
&lt;p&gt;En el interior del directorio de &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; observamos que existen asimismo
carpetas. Por ejemplo, hay una asociada al paquete Apache que instalamos en
lecciones anteriores&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo su
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; apache2/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat error.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mi usuario no tiene permiso para acceder a la carpeta de &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; de Apache.
Buscando en Google
de &lt;strong&gt;stackoverflow&lt;/strong&gt; ha resultado de ayuda. Activamos un modo de &amp;lsquo;&amp;lsquo;súper
usuario&amp;rsquo;&amp;rsquo; con &lt;code&gt;sudo su&lt;/code&gt;, ejecutamos los comandos deseados y salimos de dicho
modo con &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En el &amp;lsquo;&amp;rsquo;log&amp;rsquo;&amp;rsquo; &lt;code&gt;dmesg&lt;/code&gt; encontramos información principalmente referente al
&amp;lsquo;&amp;lsquo;hardware&amp;rsquo;&amp;rsquo; del sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cat dmesg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A modo de curiosidad, Linux posee un comando específico para acceder a este tipo
de información sin necesidad de revisar el correspondiente &amp;lsquo;&amp;rsquo;log&amp;rsquo;&amp;rsquo;. Por ejemplo,
podemos volver a nuestra carpeta de usuario y teclear &lt;code&gt;sudo dmesg&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dmesg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Así, tenemos acceso a una cantidad de información apabullante de bajo nivel
sobre el sistema.&lt;/p&gt;
&lt;p&gt;Por otra parte, como estamos trabajando con archivos de extensión considerable,
quizá sea conveniente utilizar de manera adicional los comandos &lt;code&gt;head&lt;/code&gt; o &lt;code&gt;tail&lt;/code&gt;
para centrar el foco de atención, respectivamente, en el principio o el final
del archivo (10 líneas por defecto):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo head /var/log/syslog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tail /var/log/syslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con el atributo &lt;code&gt;-n&lt;/code&gt; declaramos el número de líneas que deseamos consultar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo head -n &lt;span class="m"&gt;15&lt;/span&gt; /var/log/syslog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tail -n &lt;span class="m"&gt;5&lt;/span&gt; /var/log/syslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un atributo muy útil para &lt;code&gt;tail&lt;/code&gt; es &lt;code&gt;-f&lt;/code&gt; (&amp;lsquo;&amp;lsquo;follow&amp;rsquo;&amp;rsquo;), que deja la terminal en
suspenso y nos permite ver cambios en tiempo real en el correspondiente &amp;lsquo;&amp;rsquo;log&amp;rsquo;&amp;rsquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tail -n &lt;span class="m"&gt;5&lt;/span&gt; -f /var/log/syslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Así, podemos controlar cualquier cambio en el sistema (por ejemplo, el reinicio
de un proceso) que añada información a &lt;code&gt;syslog&lt;/code&gt;. Para terminar el seguimiento
del archivo, usamos la combinación de teclas &lt;code&gt;Ctrl + c&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Una aplicación práctica la encontramos a la hora de reproducir errores que los
usuarios reportan en tiempo real para cierto servidor.&lt;/p&gt;
&lt;p&gt;Finalmente, otro comando de utilidad para revisar &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; es &lt;code&gt;journalctl&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo journalctl -u apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este comando también permite realizar seguimiento con el atributo &lt;code&gt;-f&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Podemos conseguir resultados similares concatenando &lt;code&gt;cat&lt;/code&gt; y &lt;code&gt;grep&lt;/code&gt; (este último
comando nos permite realizar búsqueda de texto sobre un archivo o salida de otro
comando):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cat /var/log/syslog &lt;span class="p"&gt;|&lt;/span&gt; grep apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="14-gestionando-usuarios"&gt;14. Gestionando usuarios&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos la gestión de usuarios, en concreto la creación y
eliminación de usuarios, así como la creación y eliminación de grupos. Antes de
empezar, es importante conocer la existencia del siguiente archivo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /etc/passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En él encontramos un listado de todos los usuarios existentes en nuestro
sistema. En la mayoría de los casos, la línea finaliza con &lt;code&gt;/nologin&lt;/code&gt;, es decir,
son usuarios necesarios para llevar a cabo ciertas tareas de determinadas
aplicaciones y no para acceder al sistema en sí.&lt;/p&gt;
&lt;p&gt;En la línea correspondiente a mi usuario, &lt;code&gt;alexis&lt;/code&gt;,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;alexis:x:1000:1000:alexis,,,:/home/alexis:/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Los números &lt;code&gt;1000&lt;/code&gt; que aparecen son, respectivamente, las referencias para el
usuario (&amp;lsquo;&amp;lsquo;uid&amp;rsquo;&amp;rsquo;) y el grupo al que pertenece (también denominado &lt;code&gt;alexis&lt;/code&gt; en
este caso particular). A continuación, figura nuestro directorio de usuario
(&lt;code&gt;/home/alexis&lt;/code&gt;) y nuestra terminal por defecto (&lt;code&gt;/bin/bash&lt;/code&gt;). Tras mi nombre de
usuario aparece una &lt;code&gt;x&lt;/code&gt;, que es la posición que ocuparía nuestra contraseña
(oculta ahora mismo bajo ese carácter &lt;code&gt;x&lt;/code&gt;). La contraseña, de hecho, se almacena
en otro archivo diferente, ya que dista de ser idóneo que las contraseñas de los
usuarios estén en un archivo de texto de libre acceso.&lt;/p&gt;
&lt;p&gt;En general, si el &amp;lsquo;&amp;lsquo;uid&amp;rsquo;&amp;rsquo; es mayor o igual que &lt;code&gt;1000&lt;/code&gt; se tratará de un usuario
real, mientras que aquellos que posean referencias inferiores seguramente sean
usuarios de sistema (y no aparecerán por defecto en las ventanas de &amp;lsquo;&amp;rsquo;login&amp;rsquo;&amp;rsquo; de
usuario).&lt;/p&gt;
&lt;p&gt;A continuación, si tecleamos &lt;code&gt;sudo cat /etc/shadow&lt;/code&gt;, el archivo muestra
información sensible, pero no de forma abierta. En lugar de aparecer nuestra
contraseña, aparece su &lt;em&gt;hash&lt;/em&gt; (para los usuarios de sistema sí que aparece
directamente su contraseña).&lt;/p&gt;
&lt;p&gt;Un atajo útil de teclado es &lt;code&gt;!!&lt;/code&gt; que ejecuta el anterior comando escrito en la
terminal. Cuando escribimos una instrucción y no se lleva a cabo por falta de
permisos, simplemente hemos de teclear &lt;code&gt;sudo !!&lt;/code&gt; para intentar ejecutarla con
permisos de &amp;lsquo;&amp;lsquo;super user&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Otro archivo importante para conocer es &lt;code&gt;cat /etc/group&lt;/code&gt;, que nos muestra un
listado de los grupos definidos en nuestro sistema, con sus respectivas
referencias (así como sus contraseñas ocultas por el carácter &lt;code&gt;x&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Si estamos interesados en conocer a qué grupos pertenecemos, no es necesario
revisar el anterior fichero, ya que basta con teclear &lt;code&gt;groups&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;¿Cómo creamos un usuario? Mediante &lt;code&gt;adduser&lt;/code&gt; seguido del nombre del nuevo
usuario. Por ejemplo, &lt;code&gt;adduser batman&lt;/code&gt;. Sin embargo, encontramos un problema al
ejecutar el anterior comando, ya que la terminal nos indica que solo el usuario
&lt;code&gt;root&lt;/code&gt; puede añadir un usuario o un grupo al sistema. Como en anteriores
ocasiones, solventamos la situación escribiendo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo adduser batman
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta acción añade el usuario &lt;code&gt;batman&lt;/code&gt;, así como el grupo &lt;code&gt;batman&lt;/code&gt;, además de
generar un directorio de usuario para él y proporcionarle ciertos archivos de
configuración por defecto del sistema desde &lt;code&gt;/etc/skel&lt;/code&gt;. Después, nos pide una
contraseña para dicho usuario. A continuación, podemos indicar (o dejar en
blanco) algunos datos del usuario, como su nombre completo, número de
habitación, número de teléfono&amp;hellip;&lt;/p&gt;
&lt;p&gt;Si ahora escribimos &lt;code&gt;ls -l /home/&lt;/code&gt;, aparece un nuevo directorio asociado al
usuario &lt;code&gt;batman&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para cambiar a este usuario, hemos de escribir &lt;code&gt;su - batman&lt;/code&gt; e introducir su
correspondiente contraseña (la que hemos definido al crear el usuario). Si ahora
tecleamos &lt;code&gt;logout&lt;/code&gt; (o usamos la combinación de teclas &lt;code&gt;Ctrl + d&lt;/code&gt;), volvemos a
nuestro usuario principal. Por otro lado, si escribimos &lt;code&gt;sudo su - batman&lt;/code&gt;
cambiamos de usuario sin necesidad de introducir la contraseña (al trabajar con
&lt;code&gt;sudo&lt;/code&gt; es como si adoptáramos el papel del todopoderoso usuario &lt;code&gt;root&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Con el comando &lt;code&gt;passwd&lt;/code&gt; podemos cambiar la contraseña de un usuario.&lt;/p&gt;
&lt;p&gt;Para cambiar de usuario a &lt;code&gt;root&lt;/code&gt;, hemos de teclear &lt;code&gt;sudo su -&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ahora, para eliminar un usuario el comando es &lt;code&gt;userdel -r&lt;/code&gt; seguido del nombre
del usuario a suprimir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo userdel -r batman
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El atributo &lt;code&gt;-r&lt;/code&gt; se emplea para eliminar asimismo el directorio del usuario, por
lo que hemos de actuar con cautela cuando llevamos a cabo este proceso.&lt;/p&gt;
&lt;p&gt;Acto seguido, para añadir un grupo, el comando es &lt;code&gt;groupadd&lt;/code&gt; seguido del nombre
del grupo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupadd heroes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /etc/group
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para introducir nuestro usuario en este nuevo grupo, el comando a emplear es:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo usermod -aG heroes alexis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groups
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No obstante, aunque hemos ejecutado el comando, no aparece el grupo &lt;code&gt;heroes&lt;/code&gt;
asociado a nuestro usuario. Para ello, hemos de hacer &amp;lsquo;&amp;rsquo;logout&amp;rsquo;&amp;rsquo; y &amp;lsquo;&amp;rsquo;login&amp;rsquo;&amp;rsquo; en
el sistema. Sin embargo, en este momento, basta teclear &lt;code&gt;groups alexis&lt;/code&gt; para
comprobar que, efectivamente, mi usuario pertenece al grupo &lt;code&gt;heroes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Eliminar un usuario de un grupo es también sencillo, ya que basta teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gpasswd -d alexis heroes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groups alexis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente, para eliminar un grupo, escribimos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupdel heroes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y podemos comprobar que, efectivamente, no pertenece al listado de grupos
tecleando, por ejemplo, &lt;code&gt;tail /etc/group&lt;/code&gt; y observando que no aparece al final
ninguna línea asociada a &lt;code&gt;heroes&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="15-examinando-el-historial-de-la-terminal"&gt;15. Examinando el historial de la terminal&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos cómo aprovechar de nuevo acciones llevadas a cabo en
la terminal.&lt;/p&gt;
&lt;p&gt;En primer lugar, con las teclas de los cursores (arriba y abajo en este caso
particular), podemos desplazarnos por el historial de comandos ejecutados. Ello
nos permite ejecutarlos de nuevo o editarlos para lanzarlos de una forma
ligeramente diferente a la terminal.&lt;/p&gt;
&lt;p&gt;En segundo lugar, a través del comando &lt;code&gt;history&lt;/code&gt;, tenemos acceso a la totalidad
de comandos ejecutados en la terminal. Cada uno de ellos posee un número de
referencia al principio de la línea, de manera que podemos ejecutarlos haciendo
uso de dicho número, siempre y cuando antecedamos la referencia con el símbolo
de exclamación &lt;code&gt;!&lt;/code&gt; (por ejemplo &lt;code&gt;!283&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Ahora bien, si queremos que un comando no figure en el historial, basta pulsar
la tecla de espacio antes de empezar a escribir el comando en cuestión:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No obstante, este comportamiento depende de la distribución de Linux empleada.
En Xubuntu, efectivamente, podemos emplear este recurso para evitar que ciertos
comandos aparezcan listados en el historial.&lt;/p&gt;
&lt;p&gt;¿Qué puede llevarnos a querer omitir comandos en el historial? Por ejemplo,
quizá sea una práctica recomendable para aquellos que posean cierta información
sensible (datos, contraseñas&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Finalmente, el historial también es una herramienta útil para averiguar cómo se
han resueltos incidencias en el pasado (por otras personas, si es la primera vez
que administramos cierto servidor que lleva operativo un tiempo).&lt;/p&gt;
&lt;h3 id="16-redirecciones"&gt;16. Redirecciones&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos cómo redirigir la salida de ciertos comandos para
que esta asuma el papel de entrada para otras instrucciones.&lt;/p&gt;
&lt;p&gt;Empecemos redirigiendo la salida de un comando hacia un archivo, acción que nos
puede resultar de gran utilidad para almacenar, por ejemplo, cierta información
del sistema o de sus usuarios. Para llevar a cabo dicha acción, utilizamos el
símbolo &lt;code&gt;&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l &amp;gt; file.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación, si volvemos a ejecutar el comando &lt;code&gt;ls -l &amp;gt; file.txt&lt;/code&gt;, no
observaremos cambio alguno, pues el archivo se sobrescribe. Podemos modificar
este comportamiento (un tanto peligroso y desaconsejable si no actuamos con
extrema cautela) utilizando &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;, pues añade la salida del comando al final del
archivo en lugar de sobrescribirlo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l &amp;gt;&amp;gt; file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En general, se recomienda el uso de &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; para evitar la pérdida de información
que provoca &lt;code&gt;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Por otra parte, podemos encadenar comandos con el símbolo &lt;code&gt;|&lt;/code&gt; (&amp;lsquo;&amp;lsquo;pipe&amp;rsquo;&amp;rsquo;). Por
ejemplo, imaginemos que queremos listar los contenidos de un directorio, pero
filtrar (a través del comando &lt;code&gt;grep&lt;/code&gt;) solo aquellos elementos que contengan la
palabra &lt;code&gt;file&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l &lt;span class="p"&gt;|&lt;/span&gt; grep file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como no podía ser de otra manera, podemos emplear esta filosofía a la hora de
examinar &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat file.txt &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; uniq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A primera vista, aunque hayamos usado el comando &lt;code&gt;uniq&lt;/code&gt;, apreciamos elementos
repetidos. No obstante, el diablo está en los detalles, pues a medida que hemos
ido incorporando listados al archivo &lt;code&gt;file.txt&lt;/code&gt; su tamaño ha ido incrementándose
y de ahí que aparezca en varias ocasiones.&lt;/p&gt;
&lt;p&gt;Finalmente, para contar el número de elementos aproximadamente, puede resultar
de utilidad la siguiente instrucción:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l &lt;span class="p"&gt;|&lt;/span&gt; wc -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="17-streams"&gt;17. Streams&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos los &amp;lsquo;&amp;lsquo;streams&amp;rsquo;&amp;rsquo;, un concepto relacionado con la
redirección de la salida de comandos hacia la entrada de otros. Hay tres tipos
de &amp;lsquo;&amp;lsquo;streams&amp;rsquo;&amp;rsquo; en Linux que conviene conocer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lsquo;&amp;lsquo;standard input&amp;rsquo;&amp;rsquo; (&lt;code&gt;stdin&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&amp;lsquo;&amp;lsquo;standard output&amp;rsquo;&amp;rsquo; (&lt;code&gt;stdout&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&amp;lsquo;&amp;lsquo;standard error&amp;rsquo;&amp;rsquo; (&lt;code&gt;stderr&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Entre los tres anteriores, el más sencilla de entender es &amp;lsquo;&amp;lsquo;standard output&amp;rsquo;&amp;rsquo;,
pues es el &amp;lsquo;&amp;lsquo;stream&amp;rsquo;&amp;rsquo; que se genera al emplear comandos que producen cierta
salida a la terminal. Por ejemplo, &lt;code&gt;ls -l&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A continuación, el &amp;lsquo;&amp;lsquo;stream&amp;rsquo;&amp;rsquo; de &amp;lsquo;&amp;lsquo;standard error&amp;rsquo;&amp;rsquo; aparece cuando los comandos
que empleamos arrojan errores en la terminal (aunque produzca información, como
en el caso anterior, no hemos de confundir este &amp;lsquo;&amp;lsquo;stream&amp;rsquo;&amp;rsquo; con &amp;lsquo;&amp;lsquo;standard
output&amp;rsquo;&amp;rsquo;, pues se trata de un mensaje de error). Por ejemplo, si en nuestro
sistema no disponemos de ningún directorio denominado &lt;code&gt;Turtles&lt;/code&gt;, el siguiente
comando produciría una salida al &amp;lsquo;&amp;lsquo;stream&amp;rsquo;&amp;rsquo; de &amp;lsquo;&amp;lsquo;standard error&amp;rsquo;&amp;rsquo;:
&lt;code&gt;ls /Turtles&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Acto seguido, en el siguiente ejemplo, listemos los contenidos del directorio
del usuario (en mi caso, &lt;code&gt;alexis&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l /home/alexis/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si ahora tecleamos &lt;code&gt;echo $?&lt;/code&gt;, la terminal arroja &lt;code&gt;0&lt;/code&gt; (que hemos de interpretar
como que la operación ha sido llevada a cabo con éxito). La combinación &lt;code&gt;$?&lt;/code&gt; es
una variable asociada a la salida producida por el comando anterior, mientras
que &lt;code&gt;echo&lt;/code&gt; nos permite transmitir información a la consola (por ejemplo,
&lt;code&gt;echo &amp;quot;Hola mundo&amp;quot;&lt;/code&gt; imprime en la terminal el mensaje &lt;code&gt;Hola mundo&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;No obstante, si ahora escribimos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l /Turtles/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En esta ocasión, la terminal arroja &lt;code&gt;2&lt;/code&gt;, que al ser un número distinto de cero
hemos de interpretar como un error. Así, a la hora de escribir programas
(conocidos generalmente como &amp;lsquo;&amp;lsquo;bash scripts&amp;rsquo;&amp;rsquo;), este comportamiento nos puede
resultar de utilidad para distinguir &amp;lsquo;&amp;lsquo;standard output&amp;rsquo;&amp;rsquo; de &amp;lsquo;&amp;lsquo;standard error&amp;rsquo;&amp;rsquo; y
actuar de manera acorde a cada uno.&lt;/p&gt;
&lt;p&gt;Al hilo de la anterior idea, el uso del comando &lt;code&gt;find&lt;/code&gt;, que se emplea para
buscar archivos, aporta también buenos ejemplos para entender la distinción de
los anteriores &amp;lsquo;&amp;lsquo;streams&amp;rsquo;&amp;rsquo;. Por ejemplo, si tecleamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find / -name *.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el extenso listado observamos la presencia de numerosos errores
(&lt;code&gt;Permission denied&lt;/code&gt;). Una vía de escape a esta situación es ejecutar el
anterior comando bajo el auspicio de &lt;code&gt;sudo&lt;/code&gt;, aunque recurrir al usuario &lt;code&gt;root&lt;/code&gt;
para evitar errores no es una buena práctica y únicamente deberíamos emplearlo
cuando no existe alternativa posible. Así pues, en su lugar, escribimos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find / -name *.log 2&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esto es, buscamos por nombre todos los archivos desde la raíz del sistema cuya
extensión sea &lt;code&gt;log&lt;/code&gt;, capturamos los errores (de ahí el código &lt;code&gt;2&lt;/code&gt;) y los
redirigimos a &lt;code&gt;/dev/null&lt;/code&gt;, que es una suerte de purgatorio.&lt;/p&gt;
&lt;p&gt;Actuando de tal forma, observamos únicamente los &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; para los cuales
tenemos permisos. No quiere decir esto que hayan desaparecido el resto de los
anteriores &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo;, sino que han sido desviados a &lt;code&gt;/dev/null&lt;/code&gt;, en lugar de
aparecer en el &amp;lsquo;&amp;lsquo;standard output&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;No hemos hablado todavía del &amp;lsquo;&amp;lsquo;stream&amp;rsquo;&amp;rsquo; de &amp;lsquo;&amp;lsquo;standard input&amp;rsquo;&amp;rsquo;, pero hace
referencia a todo &amp;lsquo;&amp;lsquo;input&amp;rsquo;&amp;rsquo; o entrada del usuario. Por ejemplo, se trata de
&amp;lsquo;&amp;lsquo;standard input&amp;rsquo;&amp;rsquo; cuando recogemos en variables para un programa datos que el
usuario introduce de alguna manera.&lt;/p&gt;
&lt;p&gt;En nuestros programas, podemos hacer referencia a cada uno de los &amp;lsquo;&amp;lsquo;streams&amp;rsquo;&amp;rsquo;
por número:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stdin&lt;/code&gt;, mediante &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdout&lt;/code&gt;, mediante &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stderr&lt;/code&gt;, mediante &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así, podemos modificar el anterior comando, de forma que los errores los
almacene en un archivo, &lt;code&gt;errors.txt&lt;/code&gt;, y en la terminal aparezcan únicamente
aquellos &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; para los cuales disponemos de permisos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find / -name *.log 2&amp;gt; errors.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Análogamente, podemos recopilar aquellos &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; para los cuales tenemos
permisos en un archivo, &lt;code&gt;success.txt&lt;/code&gt;, sin más que capturar el &amp;lsquo;&amp;lsquo;standard
output&amp;rsquo;&amp;rsquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find / -name *.log 1&amp;gt; success.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="18-variables"&gt;18. Variables&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos el concepto de variable en Linux. Estudiaremos cómo
crear una variable y cómo leer su contenido. Su uso está más enfocado a la
programación de &lt;em&gt;scripts&lt;/em&gt;, pero ocasionalmente pueden surgir a la hora de
manejar comandos en la terminal.&lt;/p&gt;
&lt;p&gt;Para empezar, recodemos que el comando &lt;code&gt;echo&lt;/code&gt; devuelve a la terminal el
contenido de una cadena de texto o, en este caso particular, de una variable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello world!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación, estudiemos cómo crear una variable. Por convención, el nombre de
estas se suele escribir en mayúsculas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HELLOMSG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello world!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De esta manera, hemos creado la variable &lt;code&gt;HELLOMSG&lt;/code&gt;, que contiene el mensaje
&lt;code&gt;&amp;quot;Hello world!&amp;quot;&lt;/code&gt;. Para leer su contenido, accedemos a ella en la terminal a
través del comando &lt;code&gt;echo&lt;/code&gt; y antecediendo el nombre de la variable con el símbolo
&lt;code&gt;$&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$HELLOMSG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por otra parte, las variables no tienen por qué siempre cadenas de texto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MY_NUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MY_NUM2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MY_NUM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MY_NUM2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Las variables son específicas a la sesión de la terminal. Su alcance está
limitado a la terminal en concreto donde se han definido y se perderán una vez
esta se cierre. Una forma de solventar esta situación es añadiéndolas al archivo
de configuración &lt;code&gt;.bashrc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Además, podemos insertar variables dentro de cadenas de texto, para así
personalizar mensajes. Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Alexis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MY_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;My name es &lt;/span&gt;&lt;span class="nv"&gt;$MY_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por otra parte, también podemos emplear variables como argumentos de comandos
que hemos visto en lecciones anteriores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MY_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/etc/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls &lt;span class="nv"&gt;$MY_DIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si nos encontramos en la tesitura de tener que escribir repetidamente largas
cadenas de texto, el uso de variables nos puede ahorrar mucho tiempo.&lt;/p&gt;
&lt;p&gt;Finalmente, a través del comando &lt;code&gt;env&lt;/code&gt; tenemos acceso al listado de variables de
entorno definidas en el sistema.&lt;/p&gt;
&lt;p&gt;Las que hemos definido anteriormente no aparecen en el anterior listado, pues no
están definidas como variables de entorno. Para ello, deberíamos teclear
&lt;code&gt;export MY_NAME=&amp;quot;Alexis&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="19-el-comando-find"&gt;19. El comando &lt;code&gt;find&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos un comando de extrema utilidad en Linux, &lt;code&gt;find&lt;/code&gt;,
encargado de buscar archivos en el sistema.&lt;/p&gt;
&lt;p&gt;Para empezar, si no indicamos un directorio como argumento del comando &lt;code&gt;find&lt;/code&gt;,
este asume como valor por defecto el actual directorio de trabajo. Así, si
queremos buscar por nombre el directorio &lt;code&gt;Music&lt;/code&gt;, basta con que escribamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find -name Music
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De esta forma, obtenemos como salida la ruta &lt;code&gt;./Music&lt;/code&gt;, que nos ubica el
mencionado directorio. Ahora, actuando de manera análoga:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find -name log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En esta ocasión, aparece un listado de extensión considerable (la mayoría
compuesto por errores debidos a faltas de permisos) que podemos filtrar mediante
el uso de otros parámetros. Por ejemplo, si únicamente estamos interesados en
encontrar directorios, podemos añadir &lt;code&gt;-type d&lt;/code&gt; (el valor &lt;code&gt;f&lt;/code&gt; correspondería al
tipo asociado a archivos):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find -type d -name log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por otra parte, recordemos que podemos redirigir los errores que aparecen en la
salida hacia &lt;code&gt;/dev/null&lt;/code&gt;, para que así no se muestren en el listado de la
terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find -type d -name log 2&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación, volvamos al directorio de usuario y desde allí busquemos en la
carpeta &lt;code&gt;/var&lt;/code&gt; aquellos archivos terminados en &lt;code&gt;log&lt;/code&gt; (enviando cualquier error a
&lt;code&gt;/dev/null&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find /var -type f -name &lt;span class="s2"&gt;&amp;#34;*log&amp;#34;&lt;/span&gt; 2&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es una buena práctica escribir la cadena a buscar entrecomillada.&lt;/p&gt;
&lt;p&gt;Además, con el uso de comodines, es fácil modificar el comando anterior para que
muestre los archivos que en su nombre contengan el texto &lt;code&gt;log&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find /var -type f -name &lt;span class="s2"&gt;&amp;#34;*log*&amp;#34;&lt;/span&gt; 2&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por otro lado, ¿y si queremos encontrar los archivos que han sido modificados en
la última semana? Usamos para ello el atributo &lt;code&gt;-mtime&lt;/code&gt; y le pasamos como
argumento el número de días:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find /var/log -type f -name *.log -mtime -7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Además, podemos ejecutar comandos a los resultados de la búsqueda a través del
atributo &lt;code&gt;-exec&lt;/code&gt;. Por ejemplo, si queremos eliminar aquellos &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo; que posean
7 días de antigüedad, añadiríamos al final &lt;code&gt;-exec rm {} \;&lt;/code&gt;, donde las llaves
hacen referencia a cada línea de la salida del comando find. No obstante, como
mencionamos en lecciones anteriores, hemos de ser cautos a la hora de emplear el
comando &lt;code&gt;rm&lt;/code&gt; para no eliminar del sistema información importante.&lt;/p&gt;
&lt;h3 id="20-cambiando-permisos-numéricamente"&gt;20. Cambiando permisos numéricamente&lt;/h3&gt;
&lt;p&gt;En esta sección abordaremos la gestión de permisos numéricamente. Recordemos que
el tratamiento de permisos ya lo estudiamos en la novena sección, aunque en ella
los establecimos a través de la secuencia de caracteres &lt;code&gt;rwx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Así, las equivalencias numéricas de dichos permisos son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;4&lt;/code&gt; equivale a &lt;code&gt;r&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; equivale a &lt;code&gt;w&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; equivale a &lt;code&gt;x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En la práctica, empleando el comando &lt;code&gt;chmod&lt;/code&gt; podemos escribir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch test-permissions.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;400&lt;/span&gt; test-permissions.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como podemos observar, el propietario dispone del permiso de lectura (dado el
&lt;code&gt;4&lt;/code&gt; que figura al principio del código), mientras que el resto de los permisos
quedan desactivados. Además, ni el grupo, ni el resto de los usuarios, posee
permiso alguno, pues para ellos hemos declarado un &lt;code&gt;0&lt;/code&gt; en cada caso (el primer
cero hace referencia al grupo, mientras que el segundo está asociado al resto de
usuarios).&lt;/p&gt;
&lt;p&gt;Siguiendo esta filosofía, con &lt;code&gt;chmod 444 test-permissions.txt&lt;/code&gt;, tanto el
administrador, como el grupo y el resto de los usuarios poseerían el permiso de
lectura para este fichero en concreto.&lt;/p&gt;
&lt;p&gt;En cuanto al permiso para escritura, generamos ejemplos similares a los
anteriores sin más que teclear &lt;code&gt;chmod 200 test-permissions.txt&lt;/code&gt; o
&lt;code&gt;chmod 222 test-permissions.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ahora bien, ¿cómo asignamos varios permisos simultáneamente? Por ejemplo, para
que el administrador posea todos los permisos disponibles sobre el archivo,
hemos de teclear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;700&lt;/span&gt; test-permissions.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por tanto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;7&lt;/code&gt; asigna los permisos &lt;code&gt;rwx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;6&lt;/code&gt; asigna los permisos &lt;code&gt;rw-&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5&lt;/code&gt; asigna los permisos &lt;code&gt;r-x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3&lt;/code&gt; asigna los permisos &lt;code&gt;-wx&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seguramente, a estas alturas, hayamos detectado el patrón de funcionamiento. Si
queremos asignar varios permisos, simplemente hemos de realizar la suma de sus
valores e introducir ese resultado en el dígito deseado del código numérico. Por
ejemplo, &lt;code&gt;rwx&lt;/code&gt;, echando cuentas, equivale a &lt;code&gt;4 + 2 + 1&lt;/code&gt;, esto es, a &lt;code&gt;7&lt;/code&gt;.
Análogamente, &lt;code&gt;-wx&lt;/code&gt;, equivale a &lt;code&gt;0 + 2 + 1&lt;/code&gt;, es decir, a &lt;code&gt;3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En la práctica, un código de permisos muy frecuente para archivos es &lt;code&gt;644&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Aunque en la sección hemos trabajado únicamente con ficheros, la misma filosofía
se emplea para directorios. No obstante, hemos de recordar que los permisos no
tienen exactamente el mismo significado para archivos que para carpetas, como
bien comentamos en la novena sección de este artículo.&lt;/p&gt;
&lt;h3 id="21-referencias"&gt;21. Referencias&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-historial-de-versiones-del-artículo"&gt;22. Historial de versiones del artículo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2023.06.12: Escribe la sección sobre el cambio numérico de permisos&lt;/li&gt;
&lt;li&gt;2023.06.11: Escribe la sección sobre el comando &lt;code&gt;find&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;2023.06.10: Escribe la sección sobre variables&lt;/li&gt;
&lt;li&gt;2023.06.09: Escribe la sección sobre &amp;lsquo;&amp;lsquo;streams&amp;rsquo;&amp;rsquo;&lt;/li&gt;
&lt;li&gt;2023.06.07: Escribe la sección sobre redirecciones&lt;/li&gt;
&lt;li&gt;2023.06.05: Reunifica las doce primeras lecciones en un único artículo&lt;/li&gt;
&lt;li&gt;2023.06.01: Escribe la sección sobre el historial de la terminal&lt;/li&gt;
&lt;li&gt;2023.05.31: Escribe la sección sobre la gestión de usuarios&lt;/li&gt;
&lt;li&gt;2023.05.30: Escribe la sección sobre la revisión de &amp;lsquo;&amp;rsquo;logs&amp;rsquo;&amp;rsquo;&lt;/li&gt;
&lt;li&gt;2023.05.29: Escribe la sección sobre la gestión de procesos&lt;/li&gt;
&lt;li&gt;2023.06.28: Escribe la sección sobre la gestión de paquetes&lt;/li&gt;
&lt;li&gt;2023.06.27: Escribe la sección sobre el control de recursos del sistema&lt;/li&gt;
&lt;li&gt;2023.05.26: Escribe la sección sobre permisos&lt;/li&gt;
&lt;li&gt;2023.06.25: Escribe la sección sobre el uso de alias&lt;/li&gt;
&lt;li&gt;2023.06.24: Escribe la sección sobre la configuración de la terminal&lt;/li&gt;
&lt;li&gt;2023.06.23: Escribe la sección sobre mover y renombrar archivos&lt;/li&gt;
&lt;li&gt;2023.05.22: Escribe la sección sobre la edición de archivos&lt;/li&gt;
&lt;li&gt;2023.06.21: Escribe las secciones de introducción y navegación por el sistema
de ficheros&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>