Shell y Bash
Una shell un tipo de software que provee de una interfaz para los usuarios de un sistema operativo para que estos puedan interactuar con el kernel y sus servicios. Puedes imaginarlo como una capa (concha) alrededor del kernel y sus servicios
También existen shells para diversos lenguajes de programación, por ejemplo,
ejecuta python
sin ningún argumento (sal con exit()
).
En la práctica, la shell es un intérprete que ejecuta los comandos que el usuario le dé.
La shell estándar que casi todos sistemas Linux modernos utilizan es Bourne
Again Shell (bash
), que es derivada de Bourne Shell (sh
), la primera que
apareció en Unix. Otras alternativas populares son ZSH
y Fish
. Y en Windows
se usa Powershell
.
Fuente: StackOverflow Shell vs Console vs Terminal
Terminal
Una terminal es el programa que ejecuta una shell, lee el input del usuario y se lo pasa a esta última para que pueda ser procesado, además de presentar el resultado.
Hace décadas, consistía en varios dispositivos físicos, y a medida que los sistemas Unix/Linux fueron mejorarado, estos se abstrayeron a software. Por lo tanto estos también se pueden llamar emuladores de terminal y pseudo-terminales.
Para dejarlo más claro, algunos ejemplos son Windows Terminal o Alacritty.
Consola
Esta es un tipo de terminal. Históricamente la consola era un monitor y un
teclado conectados a un puerto dedicado para tener comunicación directa y de
bajo nivel con el Sistema Operativo. Los sistemas Linux actuales ofrecen
consolas virtuales, a las que puedes acceder con Alt + F1
o Alt + Ctrl + F1
, siendo cada tecla de función una consola distinta.
Prompt
Un command prompt es un campo de entrada para comandos del usuario, y en bash suele tener este aspecto (aunque es personalizable):
1<username>@<hostname>:~$
El ~
representa el directorio actual, así que si haces cd blog/content/linux/
por ejemplo, cambiará a:
1<username>@<hostname>:~/blog/content/linux$
Y en caso de ser root:
1root@<hostname>:~/blog/content/linux#
Archivos que ejecuta Bash
Consulta este maravilloso post.
Bash diferencia entre varias posibilidades cuando una instancia suya es creada. Se distingue entre:
- interactiva y no interactiva: si el usuario tiene un prompt y envía input directamente a Bash; o bien en un script, donde el usuario no tiene interacción.
- login y non-login: cuando un usuario inicia una sesión en bash via terminal, SSH, etc; o cuando desde una shell se inicia otra.
Este último se puede comprobar con echo $0
, si devuelve -bash
será login,
y bash
si es non-login.
Bash funciona de la siguiente forma. Lee las columnas hacia abajo. Primero ejecuta A, luego B, entonces C, etc. B1, B2, B3 signfica que solo ejecuta el primero de los que encuentre.
Por lo que se puede concluir con:
bash_profile
debe ser super sencillo y solamente carga.profile
y.bashrc
en ese orden.profile
configuración no específica a Bash, debe ser compatible consh
:bash
,zsh
,ksh
… Esto puede ser variables del entorno ($PATH
), variables para aplicaciones gráficas y demás.bashrc
tiene la configuración de la shell interactiva: prompt,$EDITOR
,alias
, etc. No debe imprimir nada.
Se puede evitar la ejecución de todos estos scripts con el argumento
--noprofile
.
Al cerrar sesión (con exit
) se ejecuta ~/.bash_logout
.
Fuente: GNU Manual y el Manual sobre bash. Más información en esta respuesta de StackOverflow.
Bash config
Como ya he mencionado antes, la configuración de Bash se puede almacenar en el
archivo ~/.bashrc
, que está oculto por defecto.
Para recargar dicha configuración, puedes simplemente volver a ejecutar el script:
Bash Prompt
El prompt se controla usando variables de Bash:
PS0
: se muestra en shells interactivas después de leer un comando y antes de ejectuarlo.PS1
: prompt primario, por defecto\s-\v\$
PS2
: prompt secundario, por defecto>
PS3
: prompt para el comandoselect
, ejemplo:PS4
: se muestra antes de que un comando muestre execution trace, por defecto+
.
1PS3="Enter a number: "
2
3select character in Sheldon Leonard Penny Howard Raj
4do
5 echo "Selected character: $character"
6 echo "Selected number: $REPLY"
7done
Modificando la variable PS1
, podrás modificar tu prompt.
\u
: nombre de usuario\H
: nombre del ordenador completo\h
: nombre del ordenador hasta el primer.
\l
: nombre base de la terminal (?)\s
: nombre de la shell\$
: (UID == 0)?#
:$
. Es decir, si eres root,#
, sino$
.
\w
: dirección completa del directorio actual ($HOME
=~
)\W
: directorio actual ($HOME
=~
)
\A
: hora actual (24h HH:MM)\@
: hora actual (12h am/pm)\t
: hora actual (24h HH:MM:SS)\T
: hora actual (12h HH:MM:SS)\d
: fecha con día de la semana, nombre del mes y día (e.g.:Tue May 26
)\D{<formato>}: fecha con el formato dado. Se formatea con
strftime`.
\j
: número de trabajos de la shell actual\#
: número de comando\!
: número de comando en el historial
\\
=\
\a
: sonido de campana (ASCII)\n
: nueva línea\r
: retorno de carro\nnn
: carácter en formato octal\e
: carácter especial de ASCII\[
: secuencia de caracteres no imprimibles\]
: fin de secuencia de caracteres no imprimibles
\V
: versión de bash completa (e.g.: 2.0.0)\v
: versión de bash (e.g.: 2.0)
Colores (uso \e[<colornum>m...\e[m
):
Fondo | Letra | |
---|---|---|
Negro | 40 | 30 |
Rojo | 41 | 31 |
Verde | 42 | 32 |
Amarillo | 43 | 33 |
Azul | 44 | 34 |
Violeta | 45 | 35 |
Cian | 46 | 36 |
Blanco | 47 | 37 |
Ejemplo:
1export PS1="\e[46m\u@\h:\w\e[m\$ " # en cian: <usuario>@<hostname>:~$
Alias
Un alias es tal y como suena, darle un nickname a un comando que utilizas
mucho, como por ejemplo ls -lh
.
Otros alias comunes son:
1alias ..="cd .."
2alias ...="cd ../.."
3alias ....="cd ../../.."
4alias .4="cd ../../../.."
5alias .5="cd ../../../../.."
6
7alias la="ls -lah"
8alias rm="rm -i" # Pide confirmación antes de borrar
9alias cp="cp -i" # Pide confirmación antes de sobreescribir
Recuerda que también es posible añadir estos alias a su propio archivo:
~/.bash_aliases
.
Nota: Si se te lía, puedes usar
unalias -a
para eliminar todos los alias
Shopt
El comando shopt
puede usarse para cambiar cualquiera de está opciones con el
parámetro -s
:
autocd
: muevete entre directorios sin necesidad de escribir cdcdspell
: se corrigen errores en el nombre de un archivo que el usuario escribiera maldirspell
: bash intenta correguir errores de escritura en nombres de archivos durante el completadocheckwinsize
: después de cada comando, comprueba que el tamaño en líneas y columnas es correcto; y si no, lo cambiacmdhist
: bash intentará guardar en la misma entrada del historial, un un comando de multilínea. Esto permite editarlos facilmentehistappend
: se añade el histórico al archivo descrito enHISTFILE
Puedes listar todas las opciones con shopt -p
, y las actualmente configuradas
con shopt -s
.
Más información: ComputerHope
Bind
También es posible cambiar los atajos de teclado, gracias al comando bind
.
Puedes encontrar más información en Computer Hope.
Path
También es común modificar la variable PATH en esta configuración, y poder ejecutar programas de directorios personalizados:
1export PATH=$PATH:<new/path>
Nota: Ojo con modificar esta variable, ya que podrías eliminar todo el contenido y no podrías ejecutar nada.
Colores de ls
Puedes cambiar los colores de salida del comando ls
editando la variable
LS_COLORS
. Le puedes asignar a cada posible elemento (directorio, archivo,
enlace, etc) el color que quieras con esta clave:
- Azul:
34
- Verde:
32
- Verde Claro:
1;32
- Cian:
36
- Rojo:
31
- Violeta:
35
- Marrón:
33
- Amarillo:
1;33
- Blanco:
1;37
- Gris Claro:
0;37
- Negro:
30
- Gris oscuro:
1;30
di
: directoriofi
: archivoln
: enlace simbólicopi
: archivo fifoso
: archivo socketbd
: archivo de tipo block (buffered)cd
: archivo especial (character unbuffered)or
: enlace simbólico roto, es decir, dirección que no existe (huérfano)mi
: archivo que no existe, al que apunta algún enlace simbólico.
Ejemplo:
Atajos de teclado estándar para terminal
Por defecto usa los atajos de Emacs:
<C-a>
: inicio de línea (start)<C-e>
: fin de línea (end)
<C-b>
: moverse atrás un char (back)<C-f>
: moverse adelante un char (forward)<A-b>
: moverse atrás una palabra (back)<A-f>
: moverse adelante una palabra (forward)
<C-w>
: borrar palabra anterior (= ctrl-backspace)<A-d>
: borrar palabra siguiente<C-u>
: borrar hasta el inicio (vim:d0
)<C-k>
: borrar hasta el final (vim:D
)
<C-y>
: deshacer<A-.>
: escribir último argumento (similar a!$
)<C-p>
: comando anterior (previous) (up_arrow)<C-n>
: comando siguiente (next) (down_arrow)<C-l>
: limpiar pantalla<C-d>
=exit
!!
: se sustituye por el útimo comando. Útil en casos desudo !!
.