Más sobre el sistema Linux y sobre Bash
En un sistema Linux, hay varios scripts y archivos escritos en Bash que se utilizan para diversas tareas de configuración y automatización. Aquí tienes una lista de algunos de los archivos y scripts más comunes, junto con una breve explicación de su propósito:
Archivos de Configuración y Scripts Comunes en Bash:
- ~/.bashrc:
- Ubicación: Directorio de inicio del usuario.
- Propósito: Configura el entorno del usuario cuando se abre una nueva terminal interactiva. Aquí puedes definir alias, funciones y variables de entorno.
- ~/.bash_profile o ~/.profile:
- Ubicación: Directorio de inicio del usuario.
- Propósito: Se ejecuta al iniciar una sesión de login. Se usa para configurar el entorno del usuario, establecer variables de entorno y ejecutar scripts al inicio de sesión.
- /etc/bash.bashrc:
- Ubicación: Sistema global.
- Propósito: Archivo de configuración que se aplica a todos los usuarios. Se ejecuta cada vez que un usuario abre una nueva terminal interactiva.
- /etc/profile:
- Ubicación: Sistema global.
- Propósito: Se ejecuta al iniciar una sesión de login para todos los usuarios. Configura el entorno y aplica ajustes globales para todas las sesiones de usuario.
- /etc/profile.d/:
- Ubicación: Sistema global.
- Propósito: Contiene scripts adicionales que se ejecutan al iniciar una sesión de login. Permite modularizar configuraciones globales en múltiples archivos.
- ~/.bash_logout:
- Ubicación: Directorio de inicio del usuario.
- Propósito: Se ejecuta cuando un usuario cierra una sesión de login. Se usa para realizar tareas de limpieza al salir, como borrar archivos temporales.
- /etc/rc.local:
- Ubicación: Sistema global.
- Propósito: Archivo de script que se ejecuta al final del proceso de arranque del sistema. Se utiliza para ejecutar comandos y scripts específicos al inicio del sistema.
- /etc/init.d/:
- Ubicación: Sistema global.
- Propósito: Contiene scripts de inicio y parada de servicios del sistema. Los scripts aquí son utilizados por el sistema init para administrar servicios y demonios.
- /etc/crontab:
- Ubicación: Sistema global.
- Propósito: Archivo de configuración para tareas programadas (cron jobs). Permite especificar comandos o scripts que deben ejecutarse en momentos específicos.
- /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/:
- Ubicación: Sistema global.
- Propósito: Directorios que contienen scripts que se ejecutan diariamente, semanalmente o mensualmente mediante el servicio cron.
Ejemplo de Uso:
Para añadir un alias en el archivo ~/.bashrc
, podrías añadir la siguiente línea:
bash
alias ll='ls -lah'
Esto define el alias ll
para ejecutar ls -lah
, que lista los archivos en un formato largo y detallado, incluyendo archivos ocultos.
Estos son algunos de los archivos y scripts más comunes escritos en Bash en un sistema Linux. Cada uno juega un papel importante en la configuración y automatización del sistema, permitiendo tanto a usuarios como a administradores personalizar su entorno y realizar tareas repetitivas de manera eficiente.
~/.bashrc:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
# The following block is surrounded by two delimiters.
# These delimiters must not be modified. Thanks.
# START KALI CONFIG VARIABLES
PROMPT_ALTERNATIVE=twoline
NEWLINE_BEFORE_PROMPT=yes
# STOP KALI CONFIG VARIABLES
if [ "$color_prompt" = yes ]; then
# override default virtualenv indicator in prompt
VIRTUAL_ENV_DISABLE_PROMPT=1
prompt_color='\[\033[;32m\]'
info_color='\[\033[1;34m\]'
prompt_symbol=㉿
if [ "$EUID" -eq 0 ]; then # Change prompt colors for root user
prompt_color='\[\033[;94m\]'
info_color='\[\033[1;31m\]'
# Skull emoji for root terminal
#prompt_symbol=💀
fi
case "$PROMPT_ALTERNATIVE" in
twoline)
PS1=$prompt_color'┌──${debian_chroot:+($debian_chroot)──}${VIRTUAL_ENV:+(\[\033[0;1m\]$(basename $VIRTUAL_ENV)'$prompt_color')}('$info_color'\u'$prompt_symbol'\h'$prompt_color')-[\[\033[0;1m\]\w'$prompt_color']\n'$prompt_color'└─'$info_color'\$\[\033[0m\] ';;
oneline)
PS1='${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV)) }${debian_chroot:+($debian_chroot)}'$info_color'\u@\h\[\033[00m\]:'$prompt_color'\[\033[01m\]\w\[\033[00m\]\$ ';;
backtrack)
PS1='${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV)) }${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ';;
esac
unset prompt_color
unset info_color
unset prompt_symbol
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
[ "$NEWLINE_BEFORE_PROMPT" = yes ] && PROMPT_COMMAND="PROMPT_COMMAND=echo"
# enable color support of ls, less and man, and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
export LS_COLORS="$LS_COLORS:ow=30;44:" # fix ls color for folders with 777 permissions
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias diff='diff --color=auto'
alias ip='ip --color=auto'
export LESS_TERMCAP_mb=$'\E[1;31m' # begin blink
export LESS_TERMCAP_md=$'\E[1;36m' # begin bold
export LESS_TERMCAP_me=$'\E[0m' # reset bold/blink
export LESS_TERMCAP_so=$'\E[01;33m' # begin reverse video
export LESS_TERMCAP_se=$'\E[0m' # reset reverse video
export LESS_TERMCAP_us=$'\E[1;32m' # begin underline
export LESS_TERMCAP_ue=$'\E[0m' # reset underline
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
Desglosando y explicando el contenido de .bashrc:
Vamos a desglosar y explicar el contenido de tu archivo .bashrc
paso a paso:
Introducción
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) for examples
Este archivo es ejecutado por bash
para shells no interactivos (cuando no inicias sesión directamente).
No hacer nada si no es interactivo
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Este bloque verifica si el shell es interactivo (contiene ‘i’ en -
). Si no es interactivo, sale del script.
Vamos a desglosar estos conceptos para que queden claros.
Shell Interactivo vs. Shell No Interactivo
Shell Interactivo
- Definición: Un shell interactivo es aquel en el que un usuario está directamente ingresando comandos y esperando respuestas. Se inicia cuando abres una terminal y comienza una sesión en la que puedes escribir y ejecutar comandos manualmente.
- Características: Permite la entrada de comandos del usuario, muestra resultados y generalmente incluye un prompt (como
$
o#
).
Shell No Interactivo
- Definición: Un shell no interactivo se utiliza normalmente para ejecutar scripts o comandos automatizados sin intervención directa del usuario. No espera a que el usuario ingrese comandos manualmente.
- Características: Ejecuta un script o un conjunto de comandos y luego termina sin necesidad de entrada del usuario.
Estructura de Control case
La estructura de control case
en Bash es similar a switch
en otros lenguajes de programación. Permite la ejecución de diferentes bloques de código según el valor de una variable.
Ejemplo y Explicación
case $- in
*i*) ;;
*) return;;
esac
$-
: Es una variable especial que contiene las opciones actuales del shell. Si el shell es interactivo, esta variable incluirá la letrai
.*i*
: Es un patrón de búsqueda que significa «cualquier cosa que contengai
«. Específicamente, busca sii
está presente en las opciones del shell.;;
: Finaliza una opción encase
.*) return;;
:*)
significa «cualquier cosa que no coincida con los patrones anteriores». Si$-
no contienei
, ejecutareturn
, lo que causa que el script termine inmediatamente.
¿Cómo Verifica si el Shell es Interactivo?
El bloque case
está verificando si la opción i
está presente en la variable $-
. Si i
está presente, el shell es interactivo y no hace nada (;;
). Si i
no está presente, significa que el shell no es interactivo y el script debe terminar (return
).
Resumen
- Shell Interactivo: Ingresas comandos manualmente.
- Shell No Interactivo: Ejecuta scripts sin intervención manual.
- Estructura
case
:- Verifica si el shell es interactivo buscando
i
en$-
. - Si es interactivo, no hace nada.
- Si no es interactivo, termina el script.
- Verifica si el shell es interactivo buscando
$ echo $-
himBHs
La variable especial $-
contiene un conjunto de indicadores que describen el estado del shell y las opciones que están habilitadas. Cada letra en la cadena tiene un significado específico:
- h: Habilita el historial (history).
- i: Indica que el shell es interactivo.
- m: Habilita el monitoreo de tareas (job control).
- B: Permite el uso de brace expansion.
- H: Habilita la búsqueda en el historial (history expansion).
- s: Indica que el shell está leyendo comandos de un script (cuando se usa con
-s
).
Cuando $-
No Contendría i
Para que la variable $-
no contenga la letra i
, el shell debe ser no interactivo. Esto ocurre típicamente cuando se ejecutan scripts en lugar de ingresar comandos directamente en una terminal. Aquí hay algunos ejemplos de situaciones en las que $-
no contendría i
:
- Ejecución de Scripts: Si ejecutas un script Bash, el shell que se inicia para ejecutar ese script es no interactivo.
./mi_script.sh
2. Comandos Pasados Directamente al Shell: Si ejecutas un comando directamente en el shell sin iniciar una sesión interactiva.
bash -c 'echo $-'
Cuando inicias un terminal en un sistema basado en Unix/Linux, generalmente estás utilizando Bash sin opciones explícitas. Esto significa que Bash está funcionando con sus configuraciones predeterminadas. Vamos a desglosar lo que esto significa y cómo funciona:
Bash sin Opciones Explícitas
Shell Interactivo por Defecto
Al abrir una terminal y escribir comandos directamente, estás utilizando un shell interactivo. Aquí están algunos aspectos clave de este modo:
- Lectura de Archivos de Inicio:
~/.bashrc
: Si es un shell interactivo no de login (como una terminal gráfica), Bash leerá este archivo para cargar configuraciones y funciones definidas por el usuario./etc/bash.bashrc
: Este archivo global también puede ser leído, dependiendo de la configuración de tu sistema.~/.bash_profile
,~/.bash_login
,~/.profile
: Si es un shell de login (cuando inicias sesión en modo texto, por ejemplo), estos archivos se leen en lugar de~/.bashrc
.
- Comportamiento Predeterminado:
- Historial de comandos: Se almacena en
~/.bash_history
. - Variables de entorno: Se cargan desde los archivos mencionados anteriormente.
- Alias y funciones: Definidos en los archivos de configuración del usuario.
- Historial de comandos: Se almacena en
Opciones y Parámetros de Bash
Cuando inicias un shell interactivo sin opciones específicas, Bash asume sus configuraciones predeterminadas:
- Interactividad: El shell espera y procesa comandos del usuario.
- Historial: Registra los comandos en el archivo de historial.
- Prompt: Muestra un prompt (como
$
) esperando la entrada del usuario.
Comando bash
sin Opciones
Cuando ejecutas el comando bash
sin ningún parámetro, simplemente inicias una nueva instancia de Bash con sus configuraciones predeterminadas. Ejemplo:
bash
Esto iniciará un nuevo shell interactivo. Puedes verificar esto escribiendo exit
para salir del nuevo shell y regresar al shell original.
Parámetros y Opciones de Bash
Además de -c
, aquí hay un resumen de algunas otras opciones útiles de Bash:
Opción | Descripción |
---|---|
-l | Inicia un shell de login |
-i | Inicia un shell interactivo |
-s | Lee comandos desde la entrada estándar |
--version | Muestra la versión de Bash |
--help | Muestra una ayuda corta con las opciones disponibles |
-n | Revisa la sintaxis del script sin ejecutarlo |
-v | Muestra cada línea del script mientras se lee |
-x | Muestra cada comando y sus argumentos mientras se ejecutan |
Resumen
- Shell Interactivo: Por defecto, al abrir una terminal, usas Bash sin opciones explícitas.
- Archivos de Inicio: Bash lee archivos como
~/.bashrc
y~/.bash_profile
para cargar configuraciones. - Configuraciones Predeterminadas: Incluyen el manejo del historial, variables de entorno, alias, y prompt.
- Iniciar Bash sin Opciones: Simplemente ejecuta
bash
para iniciar una nueva instancia del shell con configuraciones predeterminadas.
Estas configuraciones aseguran que tengas una experiencia de usuario coherente y predecible al trabajar en la línea de comandos de Bash.
Configuración del historial
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
HISTCONTROL=ignoreboth
: No guarda líneas duplicadas o que comiencen con espacio en el historial.
shopt -s histappend
: Añade al archivo de historial en lugar de sobrescribirlo.
HISTSIZE=1000
y HISTFILESIZE=2000
: Establecen el tamaño del historial en 1000 comandos y el archivo de historial en 2000 líneas.
Vamos a profundizar en la configuración del historial en Bash, específicamente la variable HISTCONTROL
y cómo afecta al historial de comandos.
HISTCONTROL
y sus Valores
La variable HISTCONTROL
controla cómo se manejan ciertos tipos de comandos en el historial. Vamos a desglosar sus valores y efectos.
ignoreboth
HISTCONTROL=ignoreboth
- Efecto: Equivale a combinar
ignoredups
yignorespace
.ignoredups
: Evita guardar líneas duplicadas consecutivas en el historial.ignorespace
: No guarda en el historial las líneas que comienzan con un espacio.
- Resultado: Con
ignoreboth
, el historial no guardará comandos duplicados consecutivos ni comandos que comiencen con un espacio.
Otros Valores de HISTCONTROL
- ignoredups
HISTCONTROL=ignoredups
2. ignorespace
HISTCONTROL=ignorespace
3. ignoreboth
HISTCONTROL=ignoreboth
4. erasedups
HISTCONTROL=erasedups
Efecto: Si ingresas un comando que ya existe en el historial, elimina la entrada anterior y guarda el comando en la posición más reciente.
Resultado: Solo la última instancia de un comando estará en el historial, eliminando cualquier duplicado anterior.
Ejemplos Prácticos
Usando ignoredups
HISTCONTROL=ignoredups
echo "Hello"
echo "Hello"
history
- Historial: Solo aparecerá una línea con
echo "Hello"
.
Usando ignorespace
HISTCONTROL=ignorespace
echo "This will not be saved"
history
- Historial: La línea con
echo "This will not be saved"
no se guarda porque comienza con un espacio.
Usando ignoreboth
HISTCONTROL=ignoreboth
echo "Not saved"
echo "Saved"
echo "Saved"
history
- Historial:
echo "Not saved"
no se guarda y solo una instancia deecho "Saved"
aparece en el historial.
Usando erasedups
HISTCONTROL=erasedups
echo "Repeat"
echo "Repeat"
history
- Historial: Solo la última línea de
echo "Repeat"
se guarda en el historial.
Resumen
ignoredups
: Evita duplicados consecutivos.ignorespace
: Ignora líneas que comienzan con un espacio.ignoreboth
: Combinaignoredups
yignorespace
.erasedups
: Elimina duplicados anteriores y mantiene solo la última instancia.
El archivo de historial, generalmente llamado .bash_history
, contiene los comandos ejecutados en la terminal y es controlado por estas configuraciones. Modificando HISTCONTROL
, puedes personalizar cómo se maneja tu historial de comandos para mejorar tu experiencia en la línea de comandos.
El comportamiento del historial en Bash es controlado internamente por el propio shell. Bash está diseñado para observar el valor de la variable HISTCONTROL
y ajustar su comportamiento en consecuencia. Cuando cambias el valor de HISTCONTROL
, le estás dando instrucciones al shell sobre cómo debe manejar ciertos tipos de entradas de comando en el historial.
Mecanismo Interno
- Monitoreo del Historial:
- Bash tiene un mecanismo interno que monitorea cada comando ingresado por el usuario. Después de la ejecución de cada comando, este mecanismo determina si el comando debe ser guardado en el historial.
- Revisión del Valor de
HISTCONTROL
:- Inmediatamente después de la ejecución de un comando, Bash revisa el valor de
HISTCONTROL
para decidir si debe guardar o no el comando en el historial. Dependiendo de los valores asignados aHISTCONTROL
(ignoredups
,ignorespace
, etc.), el shell aplica las reglas pertinentes.
- Inmediatamente después de la ejecución de un comando, Bash revisa el valor de
- Aplicación de las Reglas de
HISTCONTROL
:ignoredups
: Si esta opción está activa, Bash verifica si el comando ingresado es idéntico al último comando guardado en el historial. Si es así, no guarda el comando duplicado.ignorespace
: Si esta opción está activa, Bash revisa si el comando ingresado comienza con un espacio. Si es así, omite guardar el comando en el historial.ignoreboth
: Combina las reglas deignoredups
yignorespace
.erasedups
: Si esta opción está activa, Bash busca el comando ingresado en el historial. Si ya existe, elimina la entrada anterior y guarda el comando como la entrada más reciente.
- Guardado en el Archivo de Historial:
- Una vez que Bash ha decidido si debe guardar o no un comando basado en
HISTCONTROL
, actualiza el archivo de historial (.bash_history
), si corresponde, aplicando las reglas configuradas.
- Una vez que Bash ha decidido si debe guardar o no un comando basado en
Ejemplo de Funcionamiento Interno
Imaginemos que tienes la siguiente configuración en tu .bashrc
:
HISTCONTROL=ignoreboth
- Ingresas un Comando:
ls -l
- Bash Revisa
HISTCONTROL
:- Verifica
ignoreboth
y determina que no debe guardar comandos duplicados consecutivos ni comandos que comiencen con espacio.
- Verifica
- Aplicación de Reglas:
- No duplicados: Si el comando
ls -l
fue el último comando ingresado, no lo guarda de nuevo. - No espacio: Si el comando no comienza con un espacio, puede ser guardado (si no es duplicado).
- No duplicados: Si el comando
- Guardar en el Historial:
- Si pasa las verificaciones anteriores,
ls -l
se guarda en el archivo.bash_history
.
- Si pasa las verificaciones anteriores,
Resumen
- Bash monitorea cada comando y revisa
HISTCONTROL
después de la ejecución de cada comando. - Reglas de
HISTCONTROL
:ignoredups
,ignorespace
,ignoreboth
, yerasedups
dictan cómo se maneja el historial. - Proceso de verificación: Bash aplica las reglas configuradas antes de guardar el comando en el historial.
Así, cambiando el valor de HISTCONTROL
, le dices a Bash cómo quieres que maneje el historial, aplicando estas reglas cada vez que ingresas un comando.
Comando shopt
en Bash
El comando shopt
en Bash se utiliza para habilitar o deshabilitar varias opciones del shell. Este comando permite ajustar el comportamiento de Bash a través de diferentes opciones. Aquí tienes una explicación más detallada sobre cómo funciona y qué opciones puedes configurar.
Sintaxis Básica de shopt
- Habilitar una opción:
shopt -s opción
El parámetro -s
habilita la opción especificada.
- Deshabilitar una opción:
shopt -u opción
- El parámetro
-u
deshabilita la opción especificada.
Opción histappend
shopt -s histappend
- Función: Cuando habilitas
histappend
conshopt -s histappend
, le indicas a Bash que debe añadir (append) los nuevos comandos al archivo de historial (.bash_history
) en lugar de sobrescribirlo. - Uso:
shopt -s histappend
- Sin esta opción: Si
histappend
no está habilitado, cada vez que inicias una nueva sesión de shell, los comandos de la sesión anterior pueden ser sobrescritos en el archivo de historial.
Otras Opciones de shopt
shopt
tiene muchas opciones útiles que puedes habilitar o deshabilitar para personalizar el comportamiento de tu shell. Aquí tienes algunas opciones comunes y sus descripciones:
checkwinsize
:- Función: Ajusta automáticamente los valores de
LINES
yCOLUMNS
después de cada comando para reflejar el tamaño actual de la ventana del terminal. - Habilitar:
- Función: Ajusta automáticamente los valores de
shopt -s checkwinsize
2. dotglob
:
- Función: Incluye archivos y directorios que comienzan con un punto (
.
) en el proceso de globbing. - Habilitar:
shopt -s dotglob
3. extglob
:
- Función: Habilita globbing extendido, permitiendo patrones complejos en coincidencias de nombres de archivos.
- Habilitar:
shopt -s extglob
4. nullglob
:
- Función: Hace que los patrones de globbing que no coinciden con ningún archivo se expandan a una cadena vacía en lugar de ellos mismos.
- Habilitar:
shopt -s nullglob
5. nocaseglob
:
- Función: Hace que el globbing no distinga entre mayúsculas y minúsculas.
- Habilitar:
shopt -s nocaseglob
6. cdspell
:
- Función: Corrige errores tipográficos menores en los nombres de directorios en los comandos
cd
. - Habilitar:
shopt -s cdspell
7. globstar
:
- Función: Habilita la coincidencia del patrón
**
para que coincida con cualquier número de directorios y subdirectorios en una expansión de nombre de ruta. - Habilitar:
shopt -s globstar
Ejemplo Completo
Aquí hay un ejemplo de cómo puedes usar shopt
para habilitar varias opciones:
shopt -s histappend
shopt -s checkwinsize
shopt -s dotglob
shopt -s extglob
shopt -s nullglob
shopt -s nocaseglob
shopt -s cdspell
shopt -s globstar
Resumen
shopt -s
: Habilita una opción del shell.shopt -u
: Deshabilita una opción del shell.histappend
: Añade comandos al historial en lugar de sobrescribirlo.- Otras opciones útiles:
checkwinsize
,dotglob
,extglob
,nullglob
,nocaseglob
,cdspell
,globstar
.
Estas opciones permiten personalizar el comportamiento de Bash para adaptarse mejor a tus necesidades.
Las opciones que habilita el comando shopt
son configuraciones internas del shell Bash que controlan su comportamiento. No son scripts ni funciones independientes, sino que son características internas que Bash puede habilitar o deshabilitar según sea necesario. Aquí te explico cómo funcionan y dónde se encuentran:
Opciones Internas de Bash
- Configuraciones Internas: Las opciones que
shopt
habilita o deshabilita son configuraciones internas del intérprete de comandos Bash. Están codificadas dentro del propio código fuente de Bash. - Control del Comportamiento: Estas opciones permiten a los usuarios personalizar y ajustar el comportamiento del shell para satisfacer diferentes necesidades y preferencias. Cada opción de
shopt
se refiere a una funcionalidad específica que Bash puede manejar de manera diferente cuando está activada o desactivada.
Dónde se Configuran
- Código Fuente de Bash: Las definiciones de estas opciones están en el código fuente de Bash. Cuando instalas Bash, estas opciones ya están disponibles como parte del intérprete de comandos.
- Archivos de Configuración del Usuario: Los usuarios pueden habilitar o deshabilitar estas opciones en sus archivos de configuración, como
.bashrc
o.bash_profile
, utilizando el comandoshopt
.
Ejemplo de Configuración en .bashrc
# Habilitar histappend para añadir al historial en lugar de sobrescribir
shopt -s histappend
# Ajustar el tamaño de la ventana automáticamente
shopt -s checkwinsize
# Incluir archivos y directorios que comienzan con un punto en el globbing
shopt -s dotglob
# Habilitar globbing extendido
shopt -s extglob
# Hacer que los patrones de globbing que no coinciden se expandan a una cadena vacía
shopt -s nullglob
# Hacer que el globbing no distinga entre mayúsculas y minúsculas
shopt -s nocaseglob
# Corregir errores tipográficos menores en los nombres de directorios en los comandos cd
shopt -s cdspell
# Habilitar el globbing de doble asterisco (**)
shopt -s globstar
Consultar las Opciones Disponibles
Puedes listar todas las opciones disponibles de shopt
y ver su estado actual (habilitado o deshabilitado) utilizando el comando sin argumentos:
shopt
O para ver solo las opciones habilitadas:
shopt -s
Documentación
La documentación oficial de Bash, que viene con el paquete o se puede acceder en línea, describe todas estas opciones en detalle. Puedes consultar la página del manual (man bash
) para obtener información específica sobre cada opción de shopt
.
man bash
Busca la sección sobre shopt
y las opciones que se pueden configurar para obtener una descripción más técnica y detallada.
Resumen
- Opciones de
shopt
: Son configuraciones internas de Bash que controlan su comportamiento. - No son scripts ni funciones: Están codificadas en el propio Bash y se pueden habilitar o deshabilitar con
shopt
. - Configuración: Los usuarios configuran estas opciones en sus archivos de configuración como
.bashrc
. - Consulta de opciones: Usa
shopt
para listar y ver el estado de las opciones.
Estas opciones permiten personalizar y ajustar la experiencia del usuario en la línea de comandos de Bash.
Tamaño de la ventana y expansión de globos
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
shopt -s checkwinsize
: Ajusta el tamaño de la ventana después de cada comando.
#shopt -s globstar
: Si se activa (descomentando), permite el uso de **
para coincidir con directorios y subdirectorios.
Tamaño de la Ventana (checkwinsize
)
¿Qué significa el tamaño de la ventana?
El tamaño de la ventana se refiere a las dimensiones de tu terminal en términos de filas (líneas) y columnas (caracteres por línea). Cuando cambias el tamaño de tu ventana de terminal, el sistema necesita ajustar los valores de estas dimensiones para que los comandos y la salida se rendericen correctamente.
¿Por qué ajustar el tamaño de la ventana después de cada comando?
La opción checkwinsize
ajusta automáticamente las variables LINES
y COLUMNS
después de cada comando para reflejar el tamaño actual de la ventana del terminal. Esto es útil porque, sin esta opción, si cambias el tamaño de tu ventana (por ejemplo, al redimensionar la terminal), los valores de LINES
y COLUMNS
no se actualizan automáticamente, lo que puede causar problemas de visualización.
Activar checkwinsize
shopt -s checkwinsize
Con esta opción habilitada, Bash verificará el tamaño de la ventana después de cada comando y actualizará las variables LINES
y COLUMNS
en consecuencia.
Expansión de Globos (globstar
)
¿Qué es la expansión de globos?
La expansión de globos (globbing) en Bash se refiere al uso de caracteres comodín para coincidir con nombres de archivos y directorios. Los caracteres comodín más comunes son *
(que coincide con cero o más caracteres) y ?
(que coincide con un solo carácter).
¿Qué hace globstar
?
Cuando activas la opción globstar
, Bash permite el uso del patrón **
en una expansión de globos. Este patrón coincide recursivamente con todos los archivos y directorios en el árbol de directorios.
Ejemplo de Uso de globstar
- Sin
globstar
:
ls *
Esto listará todos los archivos y directorios en el directorio actual, pero no recursivamente.
2. Con globstar
:
shopt -s globstar
ls **
- Esto listará todos los archivos y directorios en el directorio actual y en todos los subdirectorios, recursivamente.
Activar globstar
shopt -s globstar
Ejemplo de Uso Práctico
Supongamos que tienes una estructura de directorios como esta:
/mi_directorio
/subdir1
archivo1.txt
/subdir2
archivo2.txt
Sin globstar
:
ls *
Esto listará solo los archivos y directorios en mi_directorio
, pero no entrará en subdir1
o subdir2
.
Con globstar
:
ls **
- Esto listará
archivo1.txt
yarchivo2.txt
también, porque está buscando recursivamente en todos los subdirectorios.
Resumen
checkwinsize
: Ajusta automáticamente los valores deLINES
yCOLUMNS
después de cada comando para reflejar el tamaño actual de la ventana del terminal.- Activar:
shopt -s checkwinsize
- Activar:
globstar
: Permite el uso del patrón**
en la expansión de globos para coincidir recursivamente con todos los archivos y directorios en el árbol de directorios.- Activar:
shopt -s globstar
- Activar:
Verificar si globstar
está activado actualmente en tu shell Bash. Puedes usar el comando shopt
para listar todas las opciones del shell y ver su estado actual. Aquí te muestro cómo hacerlo:
Verificar el Estado de globstar
Usando shopt
shopt globstar
Este comando mostrará si globstar
está habilitado (on
) o deshabilitado (off
).
Ejemplo de Salida
globstar on
o
globstar off
Esta salida te indicará si la opción globstar
está actualmente activada o no.
Verificar Todas las Opciones de shopt
Si deseas ver el estado de todas las opciones del shell, puedes usar shopt
sin argumentos:
shopt
Esto mostrará una lista completa de todas las opciones y sus estados (on/off).
Comprobación en un Script
Si estás escribiendo un script y necesitas comprobar si globstar
está habilitado, puedes hacerlo de la siguiente manera:
if shopt -q globstar; then
echo "globstar está habilitado"
else
echo "globstar no está habilitado"
fi
Resumen
- Para verificar una sola opción:
shopt globstar
- Para listar todas las opciones:
shopt
- Para usar en un script:
Estos métodos te permitirán verificar si globstar
(o cualquier otra opción de shopt
) está activado en tu shell Bash.
Resumen del archivo .bashrc
- Verifica si el shell es interactivo y sale si no lo es.
- Configura el historial de comandos, incluyendo cómo se almacenan y su tamaño.
- Ajusta el tamaño de la ventana después de cada comando.
- Configura el prompt (PS1), incluyendo colores y formato según las capacidades de la terminal.
- Configura el título de la ventana del terminal.
- Define aliases para comandos comunes como
ls
,grep
,diff
, etc., y habilita el soporte de colores. - Incluye alias adicionales desde el archivo
~/.bash_aliases
si existe. - Habilita características de autocompletado programable si los archivos necesarios existen.
- Carga NVM y su autocompletado si están instalados.
Este archivo .bashrc
está bien configurado para mejorar la experiencia en la línea de comandos con funcionalidades adicionales, colores, y una personalización del prompt para hacer el uso del terminal más eficiente y agradable.