Quel est le but de .bashrc et comment ça marche?


Réponses:


131

.bashrcest un script shell que Bash exécute à chaque démarrage interactif. Il initialise une session de shell interactive. Vous pouvez mettre n'importe quelle commande dans ce fichier que vous pourriez taper à l'invite de commande.

Vous mettez des commandes ici pour configurer le shell afin de l'utiliser dans votre environnement particulier ou pour personnaliser les éléments selon vos préférences. Une chose courante à mettre .bashrcsont les alias que vous voulez toujours être disponibles.

.bashrcfonctionne à chaque lancement de shell interactif. Si tu le dis:

$ bash ; bash ; bash

et puis frappé Ctrl-Dtrois fois, .bashrccourra trois fois. Mais si vous dites ceci à la place:

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

alors .bashrcne fonctionnera pas du tout, car -crend l'appel Bash non interactif. La même chose est vraie lorsque vous exécutez un script shell à partir d'un fichier.

Contraste .bash_profileet .profilequi ne sont exécutés qu’au début d’un nouveau shell de connexion. ( bash -l) Vous choisissez si une commande va dans .bashrcvs en .bash_profilefonction de si vous souhaitez l'exécuter une fois ou pour chaque démarrage du shell interactif.

En tant que contre-exemple aux alias, que je préfère insérer .bashrc, vous souhaitez effectuer des PATHajustements .bash_profile, car ces modifications ne sont généralement pas idempotentes :

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

Si vous définissez cela à la .bashrcplace, chaque fois que vous lancez un sous-shell interactif, :/some/additionil est ajouté jusqu'à la fin du PATHprocessus, ce qui crée un travail supplémentaire pour le shell lorsque vous tapez une commande avec erreur.

Vous obtenez un nouveau shell Bash interactif chaque fois que vous shell survi avec :sh, par exemple.


6
Petit problème: contrairement à la plupart des autres shells, bash ne charge pas automatiquement le fichier de configuration par instance .bashrclorsqu'il est lancé en tant que shell de connexion. Cela peut parfois conduire à un comportement inattendu . La solution habituelle consiste à rechercher à .bashrcpartir de .profileou à la .bash_profileplace.
Ilmari Karonen

@IlmariKaronen Etant donné qu'il .bashrcn'est pas destiné à être utilisé par d'autres coquilles, il est préférable de ne pas l'obtenir .profile(ce qui pourrait être utilisé par d'autres non- bashcoquilles).
Chepner

@IlmariKaronen que se passe-t-il (lisez: comment puis-je déboguer pourquoi) quand source ~/.bashrcou . ~/.bashrcou [[ -f ~/.bashrc ]] && source. ~/.bashrcou [ -f ~/.bashrc ] && source ~/.bashrcne fonctionne pas?
Nikos Alexandris

@ NikosAlexandris: C'est une question distincte. S'il vous plaît demander séparément .
Warren Young

@WarrenYoung je voudrais mais je me suis rendu compte que cela .bashrcprovient effectivement (en utilisant la commande recommandée de superuser.com/a/183980/128768 ) Le problème est en fait je fais face à la non sourçage de https://github.com/junegunn/fzfvia cette commande à l' intérieur .bashrc: source ~/.fzf.bash. Je lance un nouveau terminal, puis Ctrl+ Ret je reçois `__fzf_history__`bash: fzf: command not found. Je source manuellement .bashrcet le même raccourci clavier lance fzf comme prévu. Toutes mes excuses pour le bruit ici.
Nikos Alexandris

20

Le but d'un .bashrcfichier est de fournir un emplacement où vous pouvez configurer des variables, des fonctions et des alias, définir votre invite (PS1) et définir les autres paramètres que vous souhaitez utiliser à chaque démarrage de l'ouverture d'une nouvelle fenêtre de terminal.

Il fonctionne en s'exécutant chaque fois que vous ouvrez un nouveau terminal, une nouvelle fenêtre ou un nouveau volet.

Vous pouvez voir le mien ici (image avec mise en évidence de la syntaxe) :

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"

Explication:

-1. Configurez mon fichier d’historique pour qu’il ignore les doublons et soit beaucoup plus volumineux que celui par défaut.
-2. Option de couleur lsselon si vous utilisez Linux ou OSX
-3. Fonction " md" pour créer un répertoire avec une commande
-4. Recherchez la branche git actuelle si vous vous trouvez dans un dépôt Git et ...
-5. -9. Définissez une invite PS1 géniale, comme dans <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / maître de l'éditeur de liens \ n $ _ </ code>
-10. Amélioration de l'invite PS2
-11. Définissez vi comme éditeur sur la ligne de commande
-12. Définissez vi comme éditeur par défaut
-13. Exécuter mon .bash_aliasesfichier s'il existe
-14. Exécutez mon script d’achèvement des onglets git (pour les télécommandes et les branches) s’il existe.
-15. Exécuter un saut automatique s'il existe
-16. Autoriser le cd'ing sans taper la partie cd si la version bash> = 4
-17. Exécutez un script d'achèvement de bash s'il existe
-18. Utilisez TMUX s'il est présent
-19. Ajoutez RVM à mon CHEMIN
-20. Utilisez rvm s'il existe.

J'ai créé ce portable pour qu'il fonctionne sur toutes mes machines Linux ou OSX sans personnalisation. Par conséquent, un certain nombre de tests de présence sont effectués avant d'utiliser certaines fonctions et d'autres scripts.

Cela facilite également l’utilisation immédiate du fichier entier dans son intégralité sur un nouvel ordinateur sans rencontrer de problèmes pouvant affecter l’ouverture d’une nouvelle fenêtre de terminal.


Overkill ...
Pacerier

hein? trop utile pour vous?
Michael Durrant

2
Merci beaucoup d'avoir partagé. Une mine d'informations ici.
Vic

7

C'est un bashfichier de configuration.

Shells interactifs (non-login), la configuration est lue à partir de ces fichiers:

  • $HOME/.bashrc

Pour les shell de connexion, la configuration est lue à partir de ces fichiers:

  • /etc/profile (Toujours à l'origine)
  • $HOME/.bash_profile (le reste de ces fichiers est vérifié dans l'ordre jusqu'à ce qu'on en trouve un, aucun autre n'est lu)
  • $HOME/.bash_login
  • $HOME/.profile

Une illustration simple de comment / quand ils sont chargés est dans l'image ci-dessous.

J'ai ajouté un echoà mon .bashrcet.bash_profile

Shell interactif vs shell de connexion

voir man bashpour plus d'informations


2
Cela n'ajoute pas vraiment de valeur ajoutée à une vieille question. En outre, je vois que vous êtes nouveau dans Unix et Linux, essayez de ne pas publier de photos de texte, il est préférable d’utiliser le format de bloc de code et de le copier à partir de votre console. Cela permet au texte d'être recherché / copié / etc. Dans le cas de votre exemple, il n’existe pas de commande compliquée ni de recherche intéressante, mais une bonne pratique pour d’autres réponses.
Centimane

1
Je ne suis pas sûr de bien comprendre votre référence à la «vieille question». Elle figure dans la liste des questions en haut et elle est pertinente pour 60 000 vues. Je pensais que la valeur ajoutée venait du format, par opposition à un dialogue / conjecture comme les réponses précédentes. mais le format a également été modifié. Je garderai à l'esprit vos commentaires sur l'utilisation de blocs de code, merci.
Timothy LJ Stewart

2
C'est en haut de la liste des questions 'actives' parce que vous avez posté une réponse. La question avait été posée à l'origine en 2014 et avait accepté une réponse. La réponse acceptée énonce l’objet .bashrcet distingue la différence entre .bashrcet .bash_profilequi couvre le contenu de votre réponse. Ne vous découragez pas, vous faites un effort honnête, mais essayez de vous concentrer sur les réponses aux questions avec un contenu non couvert par d'autres réponses.
Centimane
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.