Introducción a bash

Las interacciones más comunes con una computadora hoy en día se realizan a través de una interfaz gráfica de usuario (GUI). Antes de que existieran las GUI, los usuarios interactuaban con una compu...

Introducción

Las interacciones más comunes con una computadora hoy en día se realizan a través de una Interfaz gráfica de usuario (GUI). Antes de que existieran las GUI, los usuarios interactuaban con una computadora a través de programas shell, una Interfaz de línea de comandos (CLI) para ejecutar otros programas. A pesar de la ubicuidad de las GUI, interactuar con una computadora a través de una CLI es extremadamente útil para los usuarios, especialmente para tareas administrativas y de programación.

Intento (Bourne Again SHell) es posiblemente el programa shell más popular. Bash nos brinda muchas herramientas y comandos que nos hacen más productivos mientras navegamos y usamos nuestra computadora.

Otro caso de uso popular para Bash es para secuencias de comandos. Los scripts de shell proporcionan una forma fácil de automatizar tareas. Sin embargo, este artículo solo cubre cómo usar Bash de forma interactiva.

Instalando Bash

Bash está disponible para todos los principales sistemas operativos (aunque con una solución alternativa para Windows). Si está trabajando en una computadora Linux o macOS, Bash es probablemente su shell predeterminado.

Mac OS

Si está utilizando una Mac, también obtiene Bash de forma predeterminada. Es probable que la versión sea bastante antigua, por lo que se recomienda instalar Cerveza casera, y luego usar el siguiente comando para instalar una versión más reciente de Bash:

1
$ brew install bash

Por razones de seguridad, ahora tendrá que incluir en la lista blanca su shell recién instalado:

1
$ sudo vim /etc/shells

Nota: Se le debe solicitar su contraseña si no es el usuario root.

Asegúrese de que /usr/local/bin/bash esté en el archivo, si no, agréguelo al final.

Finalmente, cambie el shell predeterminado del sistema al que Homebrew instaló:

1
$ chsh -s /usr/local/bin/bash

Si vuelves a abrir tu terminal estarías usando la última versión de Bash.

Windows 10

Obtener Bash en Windows 10 es bastante sencillo dado que tiene un sistema de 64 bits (la función no funciona en máquinas de 32 bits) y tiene la Fall Creators Update (no es necesaria, pero sin ella debe activar el modo de desarrollador ).

Debe habilitar la función Subsistema de Windows para Linux. Dirígete al Panel de control -> Programas -> Activar o desactivar las características de Windows. En la ventana emergente, seleccione la casilla de verificación de Subsistema de Windows para Linux y presione OK. Se le pedirá que reinicie su computadora, si no lo hizo, entonces debe reiniciar antes de continuar.

Ahora necesitas instalar Linux. Dirígete a Microsoft Store y busca Linux. En la parte superior de los resultados, suele haber un banner para instalar Linux. Haga clic en esa opción y se le deberían presentar algunas [distribuciones de Linux] (https://en.wikipedia.org/wiki/Linux_distribution).

Puede leer sobre cada uno si está interesado, la mayoría de las personas encontrarían [ubuntu] (https://ubuntu.com) bastante accesible.

Una vez que su distribución de Linux esté instalada, puede buscarla en el Menú de Inicio, seleccionarla y ver una ventana emergente de Terminal en su pantalla con Bash habilitado de manera predeterminada.

contraseña

Antes de comenzar a navegar por el sistema de archivos con Bash, es bueno saber en qué directorio se encuentra actualmente. En su Terminal, ingrese pwd. Significa "directorio de trabajo de impresión" y le brinda la ruta completa de su directorio actual.

1
2
$ pwd
/home/marcus

ls

Si desea saber qué archivos y carpetas están presentes en su directorio actual, ingrese el comando ls.

1
2
$ ls
Desktop  Documents  Downloads  Music  Pictures  Projects  Public  Templates  Videos

El contenido de su carpeta de inicio puede variar, pero eso no será un problema a medida que siga este artículo.

En el sistema de archivos de Unix/Linux, cualquier archivo o carpeta que comience con "." está oculto a la vista de forma predeterminada. Por ejemplo, si quiero configurar Bash consistentemente cuando inicio sesión, entonces configuraría los archivos .profile o .bash_profile ocultos que residen en mi directorio de inicio.

Para enumerar todos los archivos y carpetas, incluidos los ocultos, podemos usar ls -a:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ ls -la
total 4096
drwxr-xr-x     3 marcus  marcus      4096 Jul 20 23:34 .
drwxr-xr-x    18 marcus  marcus      4096 Jul 10 21:04 ..
drwx------    15 marcus  marcus      4096 Jul 11 23:34 .cache
drwx------    11 marcus  marcus      4096 Jul 10 21:11 .config
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Desktop
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Documents
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Downloads
drwx------     3 marcus  marcus      4096 Jul 10 21:26 .gnupg
-rw-------     1 marcus  marcus      2310 Jul 20 17:57 .ICEauthority
drwx------     3 marcus  marcus      4096 Jul 10 21:04 .local
drwx------     5 marcus  marcus      4096 Jul 10 21:25 .mozilla
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Music
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Pictures
-rw-r-----     1 marcus  marcus      807 Jul 20 20:53 .profile
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Public
drwx------     2 marcus  marcus       442 Jul 10 21:26 .ssh
-rw-r-----     1 marcus  marcus         0 Jul 20 17:57 .sudo_as_admin_successful
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Templates
-rw-r-----     1 marcus  marcus         5 Jul 20 17:57 .vboxclient-clipboard.pid
-rw-r-----     1 marcus  marcus         5 Jul 20 17:57 .vboxclient-display.pid
-rw-r-----     1 marcus  marcus         5 Jul 20 17:57 .vboxclient-draganddrop.pid
-rw-r-----     1 marcus  marcus         5 Jul 20 17:57 .vboxclient-seamless.pid
drwxr-xr-x     2 marcus  marcus      4096 Jul 10 21:04 Videos
-rw-------     1 marcus  marcus       765 Jul 11 23:26 .viminfo

hombre

Bash proporciona el comando man, que muestra el manual del usuario para otros comandos.

En su Terminal, ingrese man ls, y debería ver un resultado como este:

comando man para el comando ls

Siempre que encuentre un comando desconocido, use man para ver cómo usarlo. Puede desplazarse por el manual con las teclas Arriba y Abajo de su teclado. Para salir de la visualización de un manual, presione la tecla q.

mkdir

Utilice el comando mkdir para crear una nueva carpeta en su directorio actual. El comando "hacer directorio" simplemente toma el nombre de la carpeta que desea crear como argumento. Ingrese mkdir FirstFolder en su Terminal. Puede confirmar que existe usando ls después de crear una carpeta.

1
2
3
$ mkdir FirstFolder
$ ls
Desktop  Documents  Downloads  FirstFolder  Music  Pictures  Projects  Public  Templates  Videos

Si desea crear una carpeta anidada, utilice mkdir con el indicador -p. Esto le dice al comando que cree todas las carpetas intermedias necesarias si aún no existen. Por ejemplo, mkdir -p SecondFolder/NestedFolder produciría lo siguiente:

1
2
3
$ mkdir -p SecondFolder/NestedFolder
$ ls SecondFolder
NestedFolder

Aquí puede ver que tanto SecondFolder como NestedFolder se crearon con un solo comando.

discos compactos

Puede pasar de una carpeta a otra con el comando cd. El comando "cambiar directorio" toma la ruta absoluta o relativa de la carpeta de destino. Ingrese cd SecondFolder/NestedFolder/ en su Terminal. Su directorio actual cambió de su directorio de inicio a NestedFolder. Siempre puedes confirmar con pwd:

1
2
3
$ cd SecondFolder/NestedFolder/
$ pwd
/home/marcus/SecondFolder/NestedFolder

Para navegar al directorio anterior ingrese cd ... En los sistemas de archivos Unix/Linux, .. usado en una ruta se refiere al directorio "sobre" del actual. Por ejemplo, SecondFolder está "sobre" NestedFolder. Cuando se usa . en una ruta, se refiere al directorio actual.

Entonces, por ejemplo, el siguiente comando te enviará "arriba" dos directorios:

1
2
3
$ cd ../..
$ pwd
/home/marcus

tocar

La forma más sencilla de crear un archivo con Bash es a través del comando touch. Regrese al directorio NestedFolder e ingrese touch first-file.txt en su Terminal para crear su primer archivo con Bash:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ cd SecondFolder/NestedFolder/
$ ls -la
total 12
drwxr-xr-x     3 marcus  marcus      4096 Jul 21 16:45 .
drwxr-xr-x    18 marcus  marcus      4096 Jul 21 16:45 ..
drwxr-xr-x     2 marcus  marcus      4096 Jul 21 16:58 NestedFolder
$ touch first-file.txt
$ ls -la
total 12
drwxr-xr-x     3 marcus  marcus      4096 Jul 21 16:59 .
drwxr-xr-x    18 marcus  marcus      4096 Jul 21 16:45 ..
-rw-r--r--     1 marcus  marcus         0 Jul 21 16:59 first-file.txt
drwxr-xr-x     2 marcus  marcus      4096 Jul 21 16:58 NestedFolder

Ahora ingrese touch first-file.txt nuevamente en su Terminal, y luego ingrese ls -la nuevamente también. Su salida debe ser similar a esto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ ls -la
total 12
drwxr-xr-x     3 marcus  marcus      4096 Jul 21 16:59 .
drwxr-xr-x    18 marcus  marcus      4096 Jul 21 16:45 ..
-rw-r--r--     1 marcus  marcus         0 Jul 21 16:59 first-file.txt
drwxr-xr-x     2 marcus  marcus      4096 Jul 21 16:58 NestedFolder
$ touch first-file.txt
$ ls -la
total 12
drwxr-xr-x     3 marcus  marcus      4096 Jul 21 16:59 .
drwxr-xr-x    18 marcus  marcus      4096 Jul 21 16:45 ..
-rw-r--r--     1 marcus  marcus         0 Jul 21 17:00 first-file.txt
drwxr-xr-x     2 marcus  marcus      4096 Jul 21 16:58 NestedFolder

Notarás que la hora junto a first-file.txt se actualizó después de ejecutar touch nuevamente. Si bien el comando touch puede crear rápidamente archivos vacíos, su función principal es actualizar las marcas de tiempo de los archivos.

pc

Para copiar un archivo, puede usar el comando cp, proporcionándole la ruta del archivo fuente, seguida de la ruta del archivo recién copiado.

Si quisiera copiar first-file.txt en NestedFolder como second-file.txt, ingresaría cp first-file.txt NestedFolder/second-file.txt. Si ingresa ls NestedFolder/ verá segundo archivo.txt:

1
2
3
4
$ ls NestedFolder/
$ cp first-file.txt ./NestedFolder/second-file.txt
$ ls NestedFolder/
second-file.txt

Para copiar carpetas, junto con su contenido, use el mismo comando que los archivos pero pase el indicador -r (recursivo). Copiemos NestedFolder en FirstFolder que reside en nuestro directorio de inicio:

1
$ cp -r NestedFolder/ ../FirstFolder/
1
2
3
4
5
6
$ ls ../FirstFolder/
$ cp -r NestedFolder/ ../FirstFolder/
$ ls ../FirstFolder/
NestedFolder
$ ls ../FirstFolder/NestedFolder/
second-file.txt

Has copiado NestedFolder y todo su contenido en FirstFolder.

Nota: Alternativamente, si ingresó cp -r NestedFolder/ ~/FirstFolder/ en la Terminal, habría obtenido el mismo resultado. Cuando se usa ~ en una ruta, se refiere al directorio de inicio.

rm

Para eliminar un archivo, simplemente use rm y la ruta del archivo. Por ejemplo, rm first-file.txt eliminaría ese archivo.

1
2
3
4
5
$ ls
first-file.txt  NestedFolder
$ rm first-file.txt
$ ls
NestedFolder

Puede eliminar una carpeta usando el indicador -r. Entonces, rm -r NestedFolder/ borra la carpeta y todo su contenido.

1
2
3
4
5
$ ls
NestedFolder
$ rm -r NestedFolder/
$ ls
$

Nota: Los elementos que elimina con rm no van a la Papelera de reciclaje en ninguno de los principales sistemas operativos. Se eliminan permanentemente. ¡Tenga mucho cuidado al eliminar archivos y carpetas!

mv

Para mover un archivo o carpeta de un directorio a otro, use el comando mv junto con la ruta del archivo/carpeta de origen y la ruta de destino. El comando "mover" se puede usar para mover archivos/carpetas a diferentes directorios y para renombrar archivos/carpetas.

En tu Terminal, ingresa los siguientes comandos:

1
2
3
4
5
6
7
$ ls
$ mv ~/FirstFolder/NestedFolder/second-file.txt .
$ ls
second-file.txt
$ mv second-file.txt hello-world.txt
$ ls
hello-world.txt

Si la ruta de destino es una carpeta, se mueve el archivo o la carpeta de origen. Si la ruta de destino es un archivo, se cambia el nombre del archivo/carpeta de origen.

Redirecciones

Digamos que desea enumerar todos los directorios en la ruta de inicio, pero almacene esa salida en un archivo en lugar de verlo en la pantalla. Bash permite esto con el operador de redirección: >: toma la salida de un comando y "redirige" a una ubicación diferente, generalmente un archivo:

1
$ ls ~ > file-list.txt

En este caso, no vería ningún resultado en la Terminal. Leamos nuestro archivo recién creado ingresando less file-list.txt. El comando less se usa para leer archivos.

Leyendo file-list.txt con menos

Introduzca q para salir less.

El operador > sobrescribe los archivos con la salida del comando. Para añadir la salida de un comando al final del archivo, podemos usar >>. Agregue la salida de ls en nuestro directorio actual a nuestro archivo de texto, ingrese:

1
$ ls >> file-list.txt

Si leemos el archivo con less una vez más, vemos nuestros dos archivos de texto:

Leyendo file-list.txt con menos después de agregar

Tuberías

Si quisiera usar la salida de un comando como entrada para otro comando, usaría una tubería: |.

Imagine que su directorio actual tuviera cientos de archivos. Escribir ls solo puede no ser muy útil si desea saber si hello-world.txt está en esa carpeta. En lugar de buscar manualmente a través de la salida de ls, puede canalizar la salida al siguiente comando Bash que realiza búsquedas, como grep.

Para averiguar si tiene un archivo llamado que contiene hola en su nombre en una carpeta, ingrese:

1
$ ls | grep hello

La salida debe ser:

1
2
$ ls | grep hello
hello-world.txt

Estas tuberías son como redireccionamientos en el sentido de que envían la salida del comando a la función de utilidad grep, que luego busca y devuelve cualquier línea que contenga "hola".

cabeza y cola {#cabeza y cola}

Hay momentos en los que desea leer solo el principio o el final de un archivo para un procesamiento rápido. El comando head lee las primeras 10 líneas de un archivo, y el comando tail lee las últimas 10 líneas de un archivo. Cada comando toma el nombre del archivo como argumento, por ejemplo, head file-list.txt muestra las primeras 10 líneas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ head file-list.txt
Desktop
Documents
Downloads
FirstFolder
Music
Pictures
Public
SecondFolder
Templates
Videos

tail file-list.txt muestra las últimas 10 líneas de un archivo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ tail file-list.txt
Downloads
FirstFolder
Music
Pictures
Public
SecondFolder
Templates
Videos
file-list.txt
hello-world.txt

Si desea ver los primeros 5 en lugar de los 10, use el indicador -5 e ingrese head -5 file-list.txt.

1
2
3
4
5
6
$ head -5 file-list.txt
Desktop
Documents
Downloads
FirstFolder
Music

El indicador numérico funciona de manera similar con tail, si desea ver las últimas 3 líneas de un archivo, ingrese tail -3 file-list.txt.

1
2
3
4
$ tail -3 file-list.txt
Videos
file-list.txt
hello-world.txt

Conclusión

Bash es un programa CLI multiplataforma que proporciona muchos comandos útiles para que podamos realizar tareas de manera efectiva en las computadoras. Sin usar una GUI, ahora puede hacer lo siguiente con Bash:

  • Navega y accede al sistema de archivos con pwd, ls y cd
  • Crea nuevas carpetas con mkdir y nuevos archivos con touch
  • Modificar archivos con cp, rm y mv
  • Redirigir la salida de los comandos a los archivos con > y usar la salida como entrada en un próximo comando con |
  • Leer archivos con less, head y tail
  • Obtenga el manual de usuario para un comando con man

Hay muchos más comandos disponibles en Bash y habilidades de lenguaje de programación versátiles para que podamos escribir tareas comunes. Dedicar algo de tiempo a aprenderlos sería invaluable para su productividad y conjunto de habilidades como desarrollador o administrador.