Bases de la Terminal

 ¿Qué es?


La terminal es una ventana donde podemos ingresar unas secuencias de comandos, estas secuencias nos permiten hacer acciones comunes.


Acciones como crear un directorio, eliminar un archivo hasta cuestiones de administración de sistemas más complejas; estos comandos son ejecutados por un programa llamado “shell”. Este programa es un intérprete de los comandos que se escriban en la terminal, y se encarga de interpretarlos al sistema operativo.


La shell o intérprete de comandos varía en los diferentes sistemas operativos, en este caso estaré usando la shell de unix: bash.


La terminal es usada para hacer acciones de manera mucho más rápida que en una interfaz visual, además, con mucha más versatilidad.


 Desplazarse en la terminal


El sistema de ficheros puede cambiar levemente entre los diferentes sistemas operativos, pero el cambio es muy leve. Este es un pequeño vistazo al sistema de ficheros en linux:


Hay algunos comandos básicos para desplazarnos en los ficheros fácilmente desde la terminal.


En la parte izquierda de la terminal, veremos una ruta, esta nos dice en qué parte de los archivos estamos.

Hay dos maneras de acceder a cualquier parte de los archivos, con una ruta absoluta y con una ruta relativa.


Para ello usaremos el comando: cd. Supongamos que se quiere llegar al Desktop y se está en la ruta /home/user. Para acceder usando la ruta absoluta se debe escribir todo el directorio hasta la ruta a la que queremos llegar.


cd /home/user/Desktop


Mientras que en la relativa, solo se debe escribir lo que queda por recorrer


cd ./Desktop


También se puede retroceder en los directorios, osea, si se quiere volver a /home/user solo se debe copiar: cd .. , y si se quiere retroceder aún más a /home se usará cd ../..


ls 


Este nos muestra los archivos que hay dentro de una carpeta


ls -lh


Nos muestra los archivos dentro de la carpeta, pero con más información en un formato entendible al ojo humano: como el peso, fecha de creación etc.


ls -a


Muestra archivos ocultos dentro de una carpeta


pwd


Muestra la ruta en la que está la terminal


Manipulación de directorios


mkdir


Crea una carpeta


cp <archivo a copiar> <ruta a copiar>


Copiar un archivo


rm -i <- Modo interactivo -rf <- Forzar eliminación  <archivo a eliminar>


Eliminar un archivo (para siempre)


mv <archivo a mover> <ruta a mover>


Mover un archivo


rmdir <opciones: -i, -rf> <directorio a eliminar>


Eliminar un directorio (carpeta)


clear


Limpiar la terminal, también se puede usar Alt + l


Observar contenido de los archivos desde la terminal


Hay ocasiones en las que se dispone de una gran cantidad de archivos, por esto hay veces en las que se quiere echar un pequeño vistazo a lo que hay dentro de ellos sin tener que ejecutarlos.


Con el comando head, podemos hacer esto. Este comando nos dice las primeras 10 líneas de algún archivo y si queremos más solo debe colocarse el parámetro -n junto al número de líneas que se desea ver.


head <archivo> -n <número de líneas>


El comando tail tiene la misma funcionalidad, pero muestra las últimas líneas.


tail <archivo> -n <número de líneas>


Podemos ver el archivo completo con el comando less, éste nos permite buscar escribiendo “/” + lo que buscamos. Salimos con la letra “q”


less <archivo>


Para abrir un archivo podemos usar xdg-open. Hay programas que tienen sus propios comandos integrados, como google-chrome para abrir el navegador Chrome.


xdg-open <archivo>


google-chrome --new-window


También podemos abrir el gestor de archivos que tengamos instalado en una determinada ruta


<nombre gestor archivos> <ruta>


Ejemplo:


thunar /home/user/Desktop


Tree es una manera más completa de listar los archivos de algún directorio, mostrando todo lo que hay dentro de ellos.


tree 


¿Qué es un comando?


Hemos hablado mucho de los comandos, pero ¿qué son?


Puede ser 3 cosas:


  • Un programa ejecutable.

  • Un comando de utilidad de la shell. (funciones propias del programa shell)

  • Una función de shell. (funciones externas a shell)

  • Un alias (una manera corta de escribir un comando)


Para saber la naturaleza del comando que se quiere escribir, usamos el comando type


type <comando>


Un comando muy útil es alias, donde podemos hacer un alias de cualquier comando. (El signo = y los “” son importantes y los espacios son contados). Este alias solo es guardado hasta que se cierra la terminal, para poder seguir usándolo hay que crear una variable de entorno.


alias <nombre alias>="<comando>"


Podemos ver las opciones y uso de un comando con la utilidad de shell “help”


help <comando>


o


<comando> --help


Podemos pedir un manual de un comando


man <comando>


Y de una manera muy resumida, podemos preguntar qué uso tiene un comando con whatis.


whatis <comando>



Wildcards


Sirven para realizar filtros de directorios o archivos, por ejemplo: encontrar todos los archivos que terminan con .py, o que comiencen con datos. Se usa el “*” para buscarlos.


ls *.py


ls datos*


Con “?”, podemos pedir la cantidad de carácteres que estén luego de la búsqueda, es decir, queremos encontrar los archivos que tengan un carácter luego de datos, entonces haremos lo siguiente.


ls datos?


Y si queremos que sean 3 carácteres, simplemente añadimos dos “?”


ls datos???



Redirecciones. ¿Cómo funciona la shell?


Tenemos una entrada (standard input ó stdin) que la shell maneja como “0”, esta entrada puede generar dos salidas: una salida satisfactoria (output ó stdout “1”), o un error (stderr “2”).


Ejemplo: Queremos listar todo el contenido de un directorio,  “ls” será el input puede entonces la salida ser correcta y listar los archivos (stout) o un error porque no están los archivos que se buscaron (stderr).


El número que acompaña el output o input se llama file descriptor, este código le sirve a la shell para saber cómo debe tratar la entrada o salida.


Podemos redireccionar las salidas a un archivo, para verificarlo luego. Esto lo hacemos con “>”


ls Desktop > archivos.txt


Ahora el listado de archivos dentro de la carpeta Desktop, estará dentro del archivo “archivos.txt”. (Si el archivo no existe se creará).


Supongamos que ahora queremos listar lo que hay dentro de Documents, y concatenarlo a lo que hay en el archivo “archivos.txt”. Si hacemos el mismo proceso:


ls Documents > archivos.txt


El archivo “archivos.txt” se creará de nuevo y se sobreescribirá, no guarda lo que había antes, entonces para concatenarlo y no perder lo que había antes usaremos “>>”


ls Documents >> archivos.txt


Ahora, si queremos redireccionar un error será un poco distinto. La shell redirecciona por defecto como si fuera un stdout, por lo que debemos decirle cómo queremos que lo maneje, ósea, con stderr.

  

Esto lo haremos usando el file descriptor, de la siguiente manera:


ls this_is_an_error  2> error.txt


Estamos usando el file descriptor de stderr para decirle a la shell que es un error y que lo guarde en el archivo “error.txt”.

Si queremos redireccionar ambos tipos de salida: stdout y stderr, lo podemos hacer de la siguiente manera:


ls this_is_an_error  > output.txt 2>&1


output.txt guardará un error.


ls Desktop > output.txt 2>&1


output.txt guardará una salida satisfactoria.


El stdin viene por defecto desde nuestro teclado, pero si queremos que sea desde un archivo usaremos “<” de la siguiente manera:


  1. Creamos el archivo “input.txt”

  2. En el escribimos un directorio, por ejemplo Documents

  3. Guardamos


En la terminal haremos lo siguiente:


ls < input.txt



Redirecciones. Pipe operator


Pipe (tubería) operator es una forma de redirección que nos permite enviar el output de una ejecución al input de otro, ósea, un mecanismo de comunicación entre procesos.


Algo parecido si concatenamos la salida de varios archivos:


cat <archivo1> <archivo2> <archivo3> ...


El pipe operator se define con: “|”, veamos un ejemplo


ls -lh | tee output.txt | less


  1. Lo primero que se está haciendo es listar todo lo que haya en un directorio

  2. Lo que había en ese directorio ahora lo guardamos en “output.txt” (tee nos ayuda igual que >, pero pasándolo por pipes)

  3. Y ahora vemos con less lo que hay dentro de “output.txt”

Podemos ordenar archivos con sort


ls -lh Documents | sort | tee documents.txt | less


Y dibujar una vaca que diga lo que nosotros queramos en arcoíris (Si no tiene los comandos puede instalarlos con “sudo apt-get install <comando>”


cowsay "cute puppy" | lolcat



Encadenando comandos. Operadores de control


Estos se pueden ejecutar de manera sincrona o asincrona, ósea, síncrona los comandos se ejecutarán uno a uno y asíncrona se ejecutarán al mismo tiempo. Para que se puedan ejecutar al mismo tiempo, la shell ejecutará cada comando en distintos hilos de la computadora, es decir, abre una terminal para cada comando.


Síncrona (;):


ls; cal; date;


Asíncrona (&):


ls & cal & date


Condicional AND (Si se cumple el anterior comando, se puede seguir ejecutando) (&&):


mkdir test && cd test


Condicional OR (Cumple alguno de los comandos) (||):


cd no_existing_folder || echo "conditional OR"


Usemos las dos condiciones


cd no_existing_folder && echo "moved successfully to folder" || echo "no existing folder"


Aquí nos enviaremos un mensaje de si el comando ha sido exitoso o no. Si ha sido exitoso se mostrará el mensaje “moved successfully to folder”, si ha ocurrido un error el mensaje será “no existing folder”.



Permisos en la terminal

Al ejecutar el comando “ls -l” podemos ver que hay unas letras junto al listado de archivos en la parte izquierda. Estas letras son los permisos que tienen cada archivo y su clasificación, veremos algo parecido a esto:


drwxr-xr-x  6 user user   4096 Feb  2  15:18  test1
-rw-rw-r--  1 user user   3702 Feb  2  16:46  todelete.txt

lrwxrwxrwx  1 user user 21 Feb  2 22:54  full-root -> ./full-backend/app.js


La primera letra es el tipo de archivo. Existen 4

  1. (-) Un archivo normal

  2. (d) Un directorio

  3. (l) Un link simbólico, ósea, un acceso directo

  4. (b) Un archivo de bloque especial. (archivos que manejan la información de los bloques de datos como una USB)


Las otras letras se dividen en 3 partes, a estas partes se les llama modo. Estas letras corresponden a 3 funcionalidades:

  • r = read (leer)

  • w = write (escribir)

  • x = execute (ejecutar)


La primera parte corresponde al dueño del archivo y los permisos que le son otorgados, el dueño es quien creó el archivo. (la parte resaltada). El dueño tiene los tres permisos (r, w, x)

drwxr-xr-x

La segunda corresponde al grupo, este es el permiso que tiene un usuario a un archivo que le fue compartido. El grupo tiene solo dos permisos (r, x)

drwxr-xr-x


Y la última parte corresponde al world u otros, este es cualquiera que no entre a las anteriores categorías. El world tiene solo dos permisos (r, x)

drwxr-xr-x


En resumen:


drwxr-xr-x


Tipo de archivo

Permisos del dueño

Permisos del grupo

Permisos del world (otros)


Los permisos pueden ser manejados en un sistema octal. Como vimos en el ejemplo, hay 3 tipos de modos cada modo podemos representarlo como un byte y su valor lo definiremos como 1 o 0. Si hay algún valor diferente a - entonces se le otorga un 1. De esta manera:


rwx r-x r-x

111 101 101


Nos quedan 3 bytes, estos los podemos expresar en un sistema octal. De derecha a izquierda en una base de 2 sumaremos los bits.

2^2 2^1 2^0 2^22^12^0 2^22^12^0

 1 1 1     1 0 1    1 0 1   

    7        5         5      


Modo simbólico: esto lo usaremos para representar el modo en la terminal

u = usuario

g = grupo

o = world

a = aplica para todos



En la terminal con el comando chmod, podemos otorgar permisos usando los bytes y el modo simbólico, de la siguiente manera.


chmod 765 <archivo>


Estamos cambiando los permisos de “archivo”, estamos diciendo:

  1. En el primer byte (7) que al dueño se le otorguen todos los permisos (r,w,x)

  2. En el segundo (6) al grupo los permisos (r,w)

  3. En el tercero (5) al world los permisos (r,x)


Podemos quitar únicamente un permiso a solo un modo de la siguiente manera.


chmod u-r <archivo>


Usamos el “-” (menos), para asignarlo de nuevo usamos “+”


chmod u+r <archivo>


De esta última manera se sobreescriben los permisos, por lo que hay que tener cuidado.


Variables de entorno


Esta es una clave dinámica que guarda un valor a la que podemos acceder desde cualquier parte de nuestra computadora. En las variables de entorno tenemos guardadas el lenguaje, la locación de la shell que usamos hasta alias que nos den agilidad.


Con echo y colocando el signo “$” podemos ver el valor de alguna variable de entorno, una muy importante es PATH


echo $PATH


Esta variable contiene la locación de todos los binarios (ejecutables) de los programas que tenemos instalados.


Al traer nuevos binarios los manejadores de paquetes (apt, npm …) se encargan de traer el repositorio e instalar ese binario en la máquina, pero no todas las veces agregan la localidad del binario a PATH. Por esto en ocasiones deberemos agregarlo manualmente.


Nos vamos a HOME, y allí modificamos el archivo donde se alojan las variables, .bashrc


nano .bashrc


Podemos usar cualquier editor de texto, desde la terminal o incluso con code (Visual Studio Code). 


Agregamos una variable en mayúsculas, sin espacios.


MESSAGE="Hello World"


Y para concatenar al PATH un binario:


PATH=$PATH/home/user/bin


Guardamos y salimos, reiniciamos bash escribiendo bash y hacemos echo a MESSAGE y PATH.


echo $MESSAGE && echo $PATH



Comandos de búsqueda


Podemos encontrar la ruta de algún binario usando which o una búsqueda más profunda con whereis


which code 


whereis code


Otro comando es find, el primer argumento será desde donde empieza a buscar y desde ahí usar:


-name (contiene ese nombre)

-type (si es un directorio o un fichero) f=fichero d=directorio

-size (tamaño)


find /home/user -type f -name "*.txt"


Este comando buscará desde home/user todos los archivos que tengan el formato txt


Hay un comando que nos permite hacer búsquedas dentro de archivos de texto, este es grep.


grep hola <archivo>


grep buscará todas las coincidencias que contengan “hola” en <archivo>. Este comando tiene muchas más utilidades, como ignorar el caseSensitive etc.



Utilidades de red


ifconfig: nos permite conocer los dispositivos de red conectados, como la máscara de red, tarjeta de red etc.


ping: nos muestra si una página está activa, es decir, si podemos acceder a ella.


curl: podemos traer la información de una página


wget: descarga el html de una página con formato


traceroute: es la ruta de computadoras por las que la nuestra debe pasar para llegar a algún lugar en la red, como una página.


netstat -i: muestra los dispositivos de red conectados de una manera más amigable que ifconfig



Compresión de archivos


Hay varios formatos que soporta unix: tar, tar.gz, zip. Los formatos son algoritmos de compresión con diferentes cualidades.


Para empaquetar un fichero con tar:


tar -cvf <archivo>.tar <path documento a empaquetar>


c  =  create

v  =  verbose : verbosely list files processed

f   =  files (regular file)


Desempaquetar:


tar -xvf <a desempaquetar>


En lugar de c, x produce la acción contraría a “create”


Con tar.gz:


tar -cvfz <archivo>.tar.gz <path documento a empaquetar>


z se le agrega para la extensión .gz


Desempaquetar tar.gz:


tar -xvfz <a desempaquetar>


Zip:


zip -r <archivo>.zip <path documento a empaquetar>


unzip <a desempaquetar>



Manejo de procesos


Los procesos son los programas que están ejecutándose en la computadora.

  • ps: podemos ver los procesos de la terminal


  • top: podemos ver todos los procesos de la computadora


  • htop: podemos ver todos los procesos de la computadora de una mejor manera


Si ejecutamos htop o top, al lado izquierdo se mostrará el “id” (process id) del proceso, podemos terminarlo o matarlo de la siguiente manera.


  1. Busca el proceso de la terminal que estás usando.

  2. Copia el “id”.



En la terminal escribe:


kill 2584


Y la terminal se cerrará, es decir, se terminó el proceso.


Publicar un comentario

Artículo Anterior Artículo Siguiente