Comandos

Definición

Un comando de shell como echo a b c consiste del comando en si mismo seguido por argumentos, separados por espacios.

Los comandos más complejos suelen estar compuestos de comandos simples combinados de distintas formas: en un pipeline en el cual el output de un comando se convierte en el input del segundo, en un bucle o condicional, o en otro tipo de grupo de comandos.

Entender comandos simples, entonces, nos sirve para poder construir sobre eso y poder ejecutar comandos más complejos.

Anatomía de un comando

Los comandos de Bash tienen la siguiente estructura:

comando <opciones> <argumentos>

Una muy buena práctica suele ser ver la ayuda de un determinado en cuestión, y analizar qué opciones pueden utilizarse y qué argumentos espera ese comando. Antes de dar un ejemplo en particular, vamos a empezar jugando con algunos comandos básicos.

Comandos básicos

pwd

[vkmc@amaterasu ~]$ pwd
/home/vkmc

pwd es uno de los primeros comandos a utilizar. Es simple, pero nos da información muy útil: donde estamos parados.

En el caso de ejemplo, estaba en la carpeta /home/<usuario> (en este caso vkmc). Es la carpeta en la que usualmente se guardan todos los datos del usuario.

echo

Ahhh, este les suena de algún lado. Ya lo venimos nombrando en secciones anteriores. Pero vamos a darle su lugarcito especial. echo tiene la unica funcionalidad de imprimir lo que pasen como parámetro. Por ejemplo, echo Hola a todos.

[vkmc@amaterasu ~]$ echo Hola a todos
Hola a todos

Van a decir, ¿para que queremos eso? Bueno... les contamos que echo tiene sus virtudes. También sirve para imprimir los contenidos de las variables de entorno (que ya les contamos, son muy importantes). Y también se usa en scripts de Bash, que no vamos a ver en este taller, pero que son muy útiles para automatizar tareas.

ls

Ahora bien, vamos a movernos un poco.

[vkmc@amaterasu ~]$ ls
Ceph Desktop Documents Downloads Music OpenStack Pictures Public snap Storage swag Templates Videos

Acabamos de usar el comando ls, comando básico al movernos entre archivos.

Veamos la ayuda para entender más.

[vkmc@amaterasu ~]$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with . (...)

Lo cortamos para simplificar un poco. Pero ahí van a ver cómo tiene que usarse el comando (en este caso es ls [opcion]... [archivo]..., bastante parecido a lo que les dijimos en la sección de Anatomía de un comando), qué hace el comando (muestra información de los archivos) y qué opciones tiene (-a, --all mostrar todos).

Usemos alguna opción.

[vkmc@amaterasu ~]$ ls -a
. .ansible .bash_history .bash_profile .cache .config Documents .esd_auth .gnome .local Music Pictures Public .ssh swag Videos .vscode
.. .ansible.cfg .bash_logout .bashrc Ceph Desktop Downloads .gitconfig .ICEauthority .mozilla OpenStack .pki snap Storage Templates .viminfo

Ok, varias cosas más... archivos que tienen un punto adelante. Esos archivos con un punto adelante, son archivos ocultos, y usualmente "se ocultan" porque son para guardar una configuración o un estado del programa. Después vamos a ver eso un poco mejor.

Otro ejemplo con más opciones

[vkmc@amaterasu ~]$ ls -laH
total 156
drwx--x---+ 24 vkmc vkmc 4096 Oct 8 23:31 .
drwxr-xr-x. 4 root root 4096 Jul 3 19:24 ..
drwxrwxr-x. 4 vkmc vkmc 4096 Jul 15 23:12 .ansible
-rw-rw-r--. 1 vkmc vkmc 75 Jul 15 23:15 .ansible.cfg
-rw-------. 1 vkmc vkmc 12309 Oct 8 18:34 .bash_history
-rw-r--r--. 1 vkmc vkmc 18 Feb 16 2019 .bash_logout
-rw-r--r--. 1 vkmc vkmc 141 Feb 16 2019 .bash_profile
-rw-r--r--. 1 vkmc vkmc 423 Jul 24 11:36 .bashrc
drwx------. 31 vkmc vkmc 4096 Sep 23 14:59 .cache
drwxrwxr-x. 3 vkmc vkmc 4096 Jul 29 20:29 Ceph
drwx------. 36 vkmc vkmc 4096 Oct 8 12:26 .config (...)

La opción -l es para poner el contenido en formato de lista, -a es para mostrar todo y -H es el modo "Human" para mostrar información legible para los humanos. La salida de ese comando es bastante diferente al primero que ejecutamos, ¿no? Y sin embargo es el mismo comando. Pueden probar diferentes combinaciones hasta que lleguen a alguna combinación que les resulte cómoda.

cd

Sigamos viendo comandos.

[vkmc@amaterasu ~]$ cd Documents/
[vkmc@amaterasu Documents]$

El comando cd es uno de esos pilares de todo lo que vamos a hacer. Nos permite desplazarnos entre directorios. Usualmente el formato es cd <directorio>, pero también lo van a ver en combinaciones más extrañas. Veamos algunas.

[vkmc@amaterasu Documents]$ cd ..
[vkmc@amaterasu ~]$

o

[vkmc@amaterasu Documents]$ cd ~
[vkmc@amaterasu ~]$

Esto que acabamos de ver son simbolos reservados. Estos simbolos representan algo en particular en Bash. Por ejemplo, '.' (punto) representa el directorio actual, '..' (punto punto) representa el directorio padre (el padre del actual) y '~' (virgulilla, ondita para los amigos) representa el "home" del usuario.

cd puede ser usado con estos simbolos y podemos hacer así la navegación mucho más sencilla porque hay que tipear menos.

También podemos variar en el tipo de path utilizado. En el primer ejemplo usamos un path relativo. Sabemos que es ese porque es un directorio que se encuentra en el nivel en el que estoy navegando. Pero también se pueden usar paths absolutos. Por ejemplo, para poder realizar exactamente la misma acción que realizamos al principio, tendríamos que haber hecho:

[vkmc@amaterasu ~]$ cd /home/vkmc/Documents/
[vkmc@amaterasu Documents]$

Como ven, exactamente el mismo resultado.

who

Un comando que tal vez no vayan a usar tan frecuentemente pero tal vez esté bueno que sepan es el comando who. Simplemente muestra información de los usuarios que están actualmente loggeados. Entre la información que se muestra, muestra en qué terminal se está ejecutando cada sesión y el horario de inicio de cada sesión.

[vkmc@amaterasu ~]$ who
vkmc tty2 2019-10-08 22:00 (tty2)

date

Un comando bastante inocente también pero muy útil. Nos permite ver la fecha y hora del sistema. Esto es necesario al trabajar en sistemas remotos que tal vez estén en otro huso horario. Para analizar, por ejemplo, logs de forma correcta es necesario saber en qué día y hora está el equipo que generó los logs.

[vkmc@amaterasu ~]$ date
Tue 08 Oct 2019 11:54:37 PM -03

Listas de comandos

Una lista es una secuencia de uno o más pipelines separador por algunos de estos operadores ';', '&', '&&', o '||', y opcionalmente terminado por ';', '&', o una nueva línea.

Si un comando es terminado por el operador &, la shell ejecuta el comando de manera asincrónica en una subshell. Esto también es conocido como ejecutar comandos en background.

$ sleep 5 &
[1] 64730
$ jobs #con este comando consulto lo que se está ejecutando en background
[1]+ Running sleep 5 &
$ jobs
[1]+ Done sleep 5

Los comandos separados por ';' son ejecutados secuencialmente; la shell espera a que cada comando finalice.

$ ping -c 5 linuxchixar.org; ls -l
PING linuxchixar.org (185.199.109.153): 56 data bytes
64 bytes from 185.199.109.153: icmp_seq=0 ttl=53 time=26.980 ms
64 bytes from 185.199.109.153: icmp_seq=1 ttl=53 time=27.883 ms
64 bytes from 185.199.109.153: icmp_seq=2 ttl=53 time=26.832 ms
64 bytes from 185.199.109.153: icmp_seq=3 ttl=53 time=27.450 ms
64 bytes from 185.199.109.153: icmp_seq=4 ttl=53 time=44.115 ms
--- linuxchixar.org ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 26.832/30.652/44.115/6.742 ms
total 32
drwx------@ 3 vovando staff 96 Aug 5 09:22 Applications
drwxr-xr-x 4 vovando staff 128 Aug 23 06:49 DCIB
drwx------+ 4 vovando staff 128 Oct 7 11:10 Desktop
drwx------+ 3 vovando staff 96 Aug 2 12:44 Documents
drwx------+ 32 vovando staff 1024 Oct 10 13:52 Downloads
(...)
drwxr-xr-x 6 vovando staff 192 Aug 27 11:54 venv
drwxr-xr-x 6 vovando staff 192 Aug 30 13:30 venv27