¿Cuál es el propósito de .bashrc y cómo funciona?

Respuestas:

131

.bashrces un script de shell que Bash ejecuta cada vez que se inicia de forma interactiva. Inicializa una sesión de shell interactiva. Puede poner cualquier comando en ese archivo que pueda escribir en el símbolo del sistema.

Coloca comandos aquí para configurar el shell para su uso en su entorno particular, o para personalizar las cosas según sus preferencias. Una cosa común para poner .bashrcson los alias que desea que siempre estén disponibles.

.bashrcse ejecuta en cada lanzamiento de shell interactivo. Si usted dice:

$ bash ; bash ; bash

y luego golpeó Ctrl-Dtres veces, .bashrccorrerá tres veces. Pero si dices esto en su lugar:

$ bash -c exit ; bash -c exit ; bash -c exit

entonces .bashrcno se ejecutará en absoluto, ya que -chace que la llamada Bash no sea interactiva. Lo mismo es cierto cuando ejecuta un script de shell desde un archivo.

Contraste .bash_profiley .profileque solo se ejecutan al comienzo de un nuevo shell de inicio de sesión. ( bash -l) Usted elige si un comando va en .bashrccontra .bash_profiledependiendo de si desea que se ejecute una vez o para cada inicio shell interactivo.

Como contraejemplo a los alias, que prefiero poner .bashrc, desea hacer PATHajustes en su .bash_profilelugar, ya que estos cambios generalmente no son idempotentes :

export PATH="$PATH:/some/addition"

Si coloca eso en su .bashrclugar, cada vez que inicia un sub-shell interactivo, :/some/additionse agregaría al final del PATHnuevo, creando trabajo adicional para el shell cuando escribe mal un comando.

Se obtiene un nuevo intérprete de comandos interactivo siempre que desembolsar devi con :sh, por ejemplo.

Warren Young
fuente
66
Pequeñas objeciones: a diferencia de la mayoría de los otros shells, bash no carga automáticamente el archivo de configuración por instancia .bashrccuando se inicia como un shell de inicio de sesión. Esto a veces puede conducir a un comportamiento inesperado . La solución habitual es obtener .bashrcde .profileo en su .bash_profilelugar.
Ilmari Karonen
@IlmariKaronen Dado .bashrcque no está destinado a ser utilizado por otros shells, es mejor no obtenerlo .profile(que podría ser utilizado por otros no bashshells).
chepner
@IlmariKaronen ¿qué ocurre (es decir: ¿cómo puedo depurar por qué) cuando source ~/.bashrco . ~/.bashrco [[ -f ~/.bashrc ]] && source. ~/.bashrco [ -f ~/.bashrc ] && source ~/.bashrcno trabajar?
Nikos Alexandris
@NikosAlexandris: Esa es una pregunta separada. Por favor pregunte por separado .
Warren Young
@WarrenYoung Lo haría, pero me di cuenta de que de .bashrchecho proviene (usando el comando recomendado de superuser.com/a/183980/128768 ). El problema que enfrentamos es en realidad el no abastecimiento de https://github.com/junegunn/fzfa través de este comando en el interior .bashrc: source ~/.fzf.bash. Lanzo una nueva terminal, luego Ctrl+ Ry obtengo `__fzf_history__`bash: fzf: command not found. .bashrcObtengo manualmente y el mismo atajo de teclado inicia fzf como se esperaba. Disculpas por el ruido aquí.
Nikos Alexandris
20

El propósito de un .bashrcarchivo es proporcionar un lugar donde pueda configurar variables, funciones y alias, definir su solicitud (PS1) y definir otras configuraciones que desee usar cada vez que abra una nueva ventana de terminal.

Funciona ejecutándose cada vez que abre una nueva terminal, ventana o panel.

Puedes ver el mío aquí (foto con resaltado de sintaxis) :

HISTCONTROL=ignoreboth:erasedups HISTSIZE=100000 HISTFILESIZE=200000
ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
md () { [ $# = 1 ] && mkdir -p "$@" && cd "$@" || echo "Error - no directory passed!"; }
git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'
set -o vi # vi at command line
export EDITOR=vim
test -f ~/.bash_aliases && . $_
test -f ~/.git-completion.bash && . $_
test -s ~/.autojump/etc/profile.d/autojump && . $_
[ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s autocd
[ -f /etc/bash_completion ] && ! shopt -oq posix && . /etc/bash_completion
[ -z $TMUX ] && export TERM=xterm-256color && exec tmux
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$home/.rvm/scripts/rvm"

Explicación:

-1. Configurar mi archivo de historial para ignorar duplicados y ser mucho más grande que el predeterminado.
-2. Opción de color lssegún si está utilizando Linux u OSX
-3. Función " md" para hacer y cd en un directorio con un comando
-4. Encuentra la rama git actual si está en un repositorio git y ...
-5. -9. Defina un impresionante aviso de PS1, como en <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </code>
-10. Mensaje de PS2 mejorado
-11. Establezca vi como editor en la línea de comando
-12. Establezca vi como el editor predeterminado
-13. ejecutar mi .bash_aliasesarchivo si existe
-14. Ejecute mi script de finalización de pestaña git (para controles remotos y ramas) si existe.
-15. Ejecute autojump si existe
-16. Permitir cd'ing sin escribir la parte cd si la versión bash> = 4
-17. Ejecute un script de finalización de bash si existe
-18. Use TMUX si está presente
-19. Añadir rvm a mi RUTA
-20. Use rvm si existe.

He hecho este portátil para que funcione en cualquiera de mis máquinas Linux u OSX sin personalización; por lo tanto, se realizan varias pruebas de presencia antes de usar ciertas funciones y otras secuencias de comandos.

Esto también facilita el uso de todo el archivo inmediatamente en una nueva máquina sin tener problemas que afecten la apertura de una nueva ventana de terminal.

Michael Durrant
fuente
Overkill ... ͏͏͏͏͏͏͏͏͏
Pacerier
eh? demasiado útil para ti?
Michael Durrant el
2
Muchas gracias por compartir. Una gran cantidad de información aquí.
Vic
7

Es un basharchivo de configuración.

Shells interactivos (sin inicio de sesión), luego la configuración se lee de estos archivos:

  • $HOME/.bashrc

Para shells de inicio de sesión, la configuración se lee de estos archivos:

  • /etc/profile (Siempre de origen)
  • $HOME/.bash_profile (el resto de estos archivos se verifican en orden hasta que se encuentra uno, luego no se leen otros)
  • $HOME/.bash_login
  • $HOME/.profile

La ilustración a continuación muestra cómo / cuándo se cargan.

Agregué una echoa mi .bashrcy.bash_profile

Shell interactivo vs shell de inicio de sesión

ver man bashpara más información

Timothy LJ Stewart
fuente
2
Esto realmente no agrega valor adicional a una pregunta anterior. Además, veo que eres nuevo en Unix y Linux, intenta no publicar imágenes de texto, en su lugar, es mejor usar el formato de bloque de código y copiarlo desde tu consola. Esto permite buscar / copiar el texto, etc. En el caso de su ejemplo, en realidad no hay comandos complicados ni nada que sea bueno para buscar, sino una buena práctica para otras respuestas.
Centimane
1
No estoy seguro de entender completamente su referencia a la 'pregunta anterior'. Está en la lista de preguntas principales y es relevante con 60k vistas. Pensé que el valor agregado provenía del formato, a diferencia de un diálogo / conjetura como las respuestas anteriores. pero el formato también ha sido editado. Tendré en cuenta sus comentarios sobre el uso de bloques de código, gracias.
Timothy LJ Stewart
2
Está en la parte superior de la lista de preguntas 'activas' porque publicaste una respuesta. La pregunta se hizo originalmente en 2014 y aceptó una respuesta. La respuesta aceptada establece el propósito .bashrcy distingue la diferencia entre .bashrcy .bash_profileque cubre el contenido de su respuesta. No se desanime, presenta un esfuerzo honesto, pero trate de concentrarse en responder preguntas con algún contenido que no esté cubierto por otras respuestas.
Centimane