Comandos y operadores de Bash

Completado

Todos los lenguajes de shell tienen sus comandos más usados. Para empezar a crear el repertorio de Bash se examinarán los comandos más usados.

Comandos de Bash

Se describirán los comandos de Bash comunes y cómo usarlos.

El comando ls

ls enumera el contenido del directorio actual o del directorio especificado en un argumento para el comando. Por sí solo, este comando enumera todos los archivos y directorios del directorio actual:

ls

Los archivos y directorios cuyos nombres empiezan por un punto están ocultos de forma predeterminada. Para incluir estos elementos en una lista de directorios, use una marca -a:

ls -a

Para obtener incluso más información sobre los archivos y directorios del directorio actual, use una marca -l:

ls -l

La siguiente es una salida de ejemplo de un directorio que contiene una serie de archivos JPEG y PNG, y un subdirectorio denominado gifs:

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

Cada línea proporciona información detallada sobre el archivo o directorio correspondiente. Esa información incluye los permisos asignados, su propietario, su tamaño en bytes, la última vez que se ha modificado y el nombre de archivo o directorio.

El comando cat

Imagine que quiere ver lo que hay dentro de un archivo. Para eso puede usar el comando cat. La salida no tendrá mucho sentido a menos que el archivo sea un archivo de texto. El comando siguiente muestra el contenido del archivo os-release almacenado en el directorio /etc:

cat /etc/os-release

Se trata de un comando útil porque indica la distribución de Linux que se ejecuta:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

El directorio /etc es especial en Linux. Contiene archivos de configuración del sistema. No le interesa eliminar ningún archivo de este directorio a menos que sepa lo que hace.

El comando sudo

Algunos comandos de Bash solo los puede ejecutar el usuario raíz: un administrador del sistema o superusuario. Si prueba uno de estos comandos sin los privilegios suficientes, se produce un error. Por ejemplo, solo los usuarios que hayan iniciado sesión como superusuario pueden usar cat para mostrar el contenido de /etc/at.deny:

cat /etc/at.deny

at.deny es un archivo especial que determina quién puede usar otros comandos de Bash para enviar trabajos para su ejecución posterior.

No es aconsejable ejecutar como usuario raíz la mayor parte del tiempo, es demasiado peligroso. Para ejecutar comandos que requieran privilegios de administrador sin iniciar sesión como un superusuario, deberá anteponer sudo a los comandos:

sudo cat /etc/at.deny

sudo equivale a "superuser do". Cuando se usa, se le indica al shell que para este comando actúa con el nivel de permiso del usuario raíz.

Los comandos cd, mkdir y rmdir

cd significa "cambiar directorio" y hace exactamente lo que sugiere el nombre: cambia el directorio actual a otro. Permite pasar de un directorio a otro, al igual que su homólogo en Windows. El comando siguiente cambia a un subdirectorio del directorio actual denominado orders:

cd orders

Puede ascender un directorio si especifica .. como nombre del directorio:

cd ..

Este comando cambia al directorio particular, al que se accede al iniciar sesión por primera vez:

cd ~

Puede crear directorios mediante el comando mkdir. El comando siguiente crea un subdirectorio denominado orders en el directorio de trabajo actual:

mkdir orders

Si quiere crear un subdirectorio y otro subdirectorio bajo él con un solo comando, use la marca --parents:

mkdir --parents orders/2019

El comando rmdir elimina (quita) un directorio, pero solo si está vacío. Si no está vacío, recibirá una advertencia en su lugar. Afortunadamente, puede usar el comando rm para eliminar directorios que no están vacíos en combinación con la marca -r (recursiva). A continuación, el comando tendría este aspecto, rm -r.

El comando rm

El comando rm es la abreviatura de "remove". Como es de esperar, rm borra los archivos. Por tanto, este comando acaba con 0001.jpg:

rm 0001.jpg

Y este comando elimina todos los archivos del directorio actual:

rm *

Tenga cuidado con rm. Es un comando peligroso.

La ejecución de rm con una marca -i le permite pensar antes de eliminar:

rm -i *

Debe convertir en costumbre la inclusión de -i en todos los comandos rm y así evitar ser víctima de una de las mayores equivocaciones de Linux. El temido comando rm -rf / elimina todos los archivos de una unidad completa. Su funcionamiento es eliminar de forma recursiva todos los subdirectorios de la raíz y sus subdirectorios. La marca -f (de "forzar") aumenta el problema mediante la eliminación de todos los mensajes. No haga esto.

Si quiere eliminar un subdirectorio denominado orders que no está vacío, puede usar el comando rm de esta manera:

rm -r orders

Esto elimina el subdirectorio orders y todo lo que contenga, incluidos otros subdirectorios.

El comando cp

El comando cp no solo copia archivos, sino directorios completos (y subdirectorios) si quiere. Para hacer una copia de 0001.jpg denominada 0002.jpg, use este comando:

cp 0001.jpg 0002.jpg

Si 0002.jpg ya existe, Bash lo reemplaza en modo silencioso. Eso es excelente si es lo que pretendía, pero no tanto si no se ha dado cuenta de que estaba a punto de sobrescribir la versión anterior.

Afortunadamente, si usa la marca -i (de "interactivo"), Bash le avisa antes de eliminar los archivos existentes. Esto es mucho más seguro:

cp -i 0001.jpg 0002.jpg

Por supuesto, puede usar caracteres comodín para copiar varios archivos a la vez. Para copiar todos los archivos del directorio actual en un subdirectorio denominado photos, haga lo siguiente:

cp * photos

Para copiar todos los archivos de un subdirectorio denominado photos en un subdirectorio denominado images, haga lo siguiente:

cp photos/* images

Aquí se supone que el directorio images ya existe. Si no es así, puede crearlo y copiar el contenido del directorio photos mediante este comando:

cp -r photos images

-r significa "recursivo". Una ventaja adicional de la marca -r es que si photos contiene subdirectorios propios, también se copian en el directorio images.

El comando ps

El comando ps proporciona una instantánea de todos los procesos actualmente en ejecución. Por sí solo, sin argumentos, muestra todos los procesos del shell, es decir, no muchos. Pero es un caso diferente cuando se incluye una marca -e:

ps -e

-e enumera todos los procesos en ejecución que, por lo general, son muchos.

Para obtener una visión más completa de los procesos que se ejecutan en el sistema, use la marca -ef:

ps -ef 

Esta marca muestra los nombres de todos los procesos en ejecución, sus números de identificación de proceso (PID), los PID de sus elementos primarios (PPID) y cuándo se iniciaron (STIME). También muestra a qué terminal, si existe, están asociados (TTY), cuánto tiempo de CPU acumulan (TIME) y sus nombres de ruta de acceso completos. Este es un ejemplo abreviado:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Por otro lado, es posible que encuentre documentación en la que se muestre que ps se usa de esta manera:

ps aux

ps aux y ps -ef son iguales. Esta dualidad se remonta a diferencias históricas entre los sistemas POSIX de Unix (como Linux) y los sistemas BSD de Unix (el más común es macOS). Al principio, POSIX usaba -ef mientras que en BSD era necesario aux. En la actualidad, ambas familias del sistema operativo aceptan los dos formatos.

Esto sirve como un excelente recordatorio de por qué debería consultar con atención todos los comandos de Linux en el manual. Aprender Bash es como aprender inglés como segundo idioma. Hay muchas excepciones a las reglas.

El comando w

Los usuarios vienen y van y, en ocasiones, recibe usuarios que no quiere. Cuando un empleado se marcha en busca de nuevas oportunidades, se llama al administrador del sistema para asegurarse de que el trabajador ya no puede iniciar sesión en los sistemas informáticos de la empresa. También se espera que los administradores del sistema sepan quién han iniciado sesión y quién no debería hacerlo.

Para averiguar quién está en los servidores, Linux proporciona el comando w ("quién"). Muestra información sobre los usuarios que están actualmente en el sistema del equipo y sus actividades. w muestra los nombres de usuario, sus direcciones IP, cuándo han iniciado sesión, qué procesos ejecutan actualmente y cuánto tiempo consumen esos procesos. Es una herramienta valiosa para los administradores del sistema.

Operadores de E/S de Bash

Puede hacer muchas cosas en Linux con tan solo ejecutar comandos de Bash y sus numerosas opciones. Pero cuando en realidad se consigue realizar el trabajo es si los comandos se combinan mediante operadores de E/S:

  • < para redirigir la entrada a un origen que no sea el teclado
  • > para redirigir la salida a un destino distinto de la pantalla
  • >> para hacer lo mismo, pero anexar en lugar de sobrescribir
  • | para canalizar la salida de un comando a la entrada de otro

Imagine que quiere enumerar todo lo que hay en el directorio actual, pero capturar la salida en un archivo denominado listing.txt. El comando siguiente hace justamente eso:

ls > listing.txt

Si listing.txt ya existe, se sobrescribe. Si en su lugar usa el operador >>, la salida de ls se anexa a lo que ya haya en listing.txt:

ls >> listing.txt

El operador de canalización es extremadamente eficaz (y se usa con frecuencia). Redirige la salida del primer comando a la entrada del segundo. Imagine que usa cat para mostrar el contenido de un archivo grande, pero el contenido se desplaza demasiado rápido para poder leerlo. Puede hacer que la salida sea más fácil de administrar si canaliza los resultados a otro comando, como more. El comando siguiente muestra todos los procesos actualmente en ejecución. Pero una vez completada la pantalla, la salida se pausa hasta que presione Entrar para mostrar la línea siguiente:

ps -ef | more

También puede canalizar la salida a head para ver solo las primeras líneas:

ps -ef | head

O supongamos que desea filtrar la salida para incluir solo las líneas que contienen la palabra "daemon". Una manera de hacerlo es canalizando la salida de ps a la herramienta grep útil de Linux:

ps -ef | grep daemon

La salida podría tener este aspecto:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

También puede usar archivos como entrada. De forma predeterminada, la entrada estándar procede del teclado, pero también se puede redirigir. Para obtener la entrada de un archivo en lugar del teclado, use el operador <. Una tarea común del administrador del sistema consiste en ordenar el contenido de un archivo. Como sugiere el nombre, sort ordena el texto en orden alfabético:

sort < file.txt

Para guardar los resultados ordenados en un archivo nuevo, puede redirigir la entrada y la salida:

sort < file.txt > sorted_file.txt

Puede usar operadores de E/S para encadenar comandos de Linux según sea necesario. Observe el comando siguiente:

cat file.txt | fmt | pr | lpr

La salida de cat va a fmt, la de fmt va a pr, y así sucesivamente. fmt da formato a los resultados en un párrafo ordenado. pr pagina los resultados. Y lpr envía la salida paginada a la impresora. Todo en una sola línea.