Qual è lo scopo di .bashrc e come funziona?


Risposte:


131

.bashrcè uno script di shell che Bash esegue ogni volta che viene avviato in modo interattivo. Inizializza una sessione di shell interattiva. È possibile inserire qualsiasi comando in quel file che è possibile digitare al prompt dei comandi.

Metti qui i comandi per impostare la shell per l'uso nel tuo ambiente particolare o per personalizzare le cose in base alle tue preferenze. Una cosa comune da inserire .bashrcsono gli alias che vuoi essere sempre disponibili.

.bashrcfunziona ad ogni lancio interattivo della shell. Se dici:

$ bash ; bash ; bash

e quindi premere Ctrl-Dtre volte, .bashrcverrà eseguito tre volte. Ma se dici questo invece:

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

quindi .bashrcnon funzionerà affatto, poiché -crende la chiamata Bash non interattiva. Lo stesso vale quando si esegue uno script di shell da un file.

Contrasto .bash_profilee .profileche vengono eseguiti solo all'inizio di una nuova shell di accesso. ( bash -l) Sei tu a scegliere se un comando va .bashrccontro vs a .bash_profileseconda che tu voglia eseguirlo una volta o per ogni avvio interattivo della shell.

Come un controesempio per pseudonimi, che preferisco a mettere in .bashrc, si vuole fare PATHaggiustamenti .bash_profile, invece, dal momento che questi cambiamenti sono in genere non idempotente :

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

Se lo metti .bashrcinvece, ogni volta che avvii una sotto-shell interattiva, verrai :/some/additionbloccato alla fine del PATHnuovo, creando ulteriore lavoro per la shell quando digiti male un comando.

È possibile ottenere una nuova shell Bash interattivo ogni volta che sborsare divi con :sh, per esempio.


6
Un piccolo inconveniente: a differenza di molti altre shell, bash non non carica automaticamente il file di configurazione per-esempio .bashrcquando è iniziato come una shell di login. Questo a volte può portare a comportamenti imprevisti . La soluzione più comune è quella fonte .bashrcda .profileo .bash_profileinvece.
Ilmari Karonen,

@IlmariKaronen Dato che .bashrcnon è destinato all'uso da parte di altre shell, è meglio non utilizzarlo .profile(che potrebbe essere utilizzato da altre non bashshell).
Chepner

@IlmariKaronen cosa succede (leggi: come posso eseguire il debug del perché) quando source ~/.bashrco . ~/.bashrco [[ -f ~/.bashrc ]] && source. ~/.bashrco [ -f ~/.bashrc ] && source ~/.bashrcnon funziona?
Nikos Alexandris,

@NikosAlexandris: Questa è una domanda separata. Si prega di chiedere separatamente .
Warren Young,

@WarrenYoung Vorrei, ma mi sono reso conto che .bashrcè effettivamente di provenienza (utilizzando il comando consigliato da superuser.com/a/183980/128768 ). Il problema mi trovo di fronte è in realtà il non approvvigionamento di https://github.com/junegunn/fzftramite questo comando all'interno .bashrc: source ~/.fzf.bash. Lancio un nuovo terminale, quindi Ctrl+ Re ottengo `__fzf_history__`bash: fzf: command not found. .bashrcSorgo manualmente e lo stesso tasto di scelta rapida avvia fzf come previsto. Ci scusiamo per il rumore qui.
Nikos Alexandris,

20

Lo scopo di un .bashrcfile è fornire un luogo in cui è possibile impostare variabili, funzioni e alias, definire il prompt (PS1) e definire altre impostazioni che si desidera utilizzare ogni volta che si apre una nuova finestra del terminale.

Funziona eseguendo ogni volta che si apre un nuovo terminale, finestra o riquadro.

Puoi vedere il mio qui (immagine con evidenziazione della sintassi) :

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"

Spiegazione:

-1. Imposta il mio file di cronologia per ignorare i duplicati ed essere molto più grande di quello predefinito.
-2. Opzione a colori per lsdipendere da se stai usando Linux o OSX
-3. Funzione " md" per creare e cd in una directory con un comando
-4. Trova il ramo git corrente se in un repository git e ...
-5. -9. Definisci un fantastico prompt per PS1, come in <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </code>
-10. Miglioramento del prompt di PS2
-11. Impostare vi come editor dalla riga di comando
-12. Impostare vi come editor predefinito
-13. esegui il mio .bash_aliasesfile se esiste
-14. Esegui lo script di completamento della mia scheda git (per telecomandi e rami) se esiste.
-15. Eseguire autojump se esiste
-16. Consenti il ​​cd senza digitare la parte cd se la versione bash> = 4
-17. Eseguire uno script di completamento bash se esiste
-18. Utilizzare TMUX se è presente
-19. Aggiungi rvm al mio PERCORSO
-20. Usa rvm se esiste.

Ho realizzato questo portatile in modo che funzioni su qualsiasi delle mie macchine linux o OSX senza personalizzazione, quindi un certo numero di test per la presenza vengono eseguiti prima di utilizzare determinate funzioni e altri script.

Ciò semplifica inoltre l'utilizzo immediato dell'intero file su una nuova macchina senza problemi che incidono sull'apertura di una nuova finestra del terminale.


Overkill ... ͏͏͏͏͏͏͏͏͏
Pacerier

eh? troppo utile per te?
Michael Durrant,

2
Grazie mille per la condivisione. Una ricchezza di informazioni qui.
Vic

7

È un bashfile di configurazione.

Shell interattive (non di accesso), quindi la configurazione viene letta da questi file:

  • $HOME/.bashrc

Per le shell di accesso, la configurazione viene letta da questi file:

  • /etc/profile (Sempre di provenienza)
  • $HOME/.bash_profile (il resto di questi file viene controllato in ordine fino a quando non ne viene trovato uno, quindi non ne vengono letti altri)
  • $HOME/.bash_login
  • $HOME/.profile

La semplice illustrazione di come / quando vengono caricati è nell'immagine qui sotto.

Ho aggiunto un echoal mio .bashrce.bash_profile

Shell interattiva vs shell di accesso

vedi man bashper maggiori informazioni


2
Questo in realtà non aggiunge ulteriore valore a una vecchia domanda. Inoltre, vedo che sei nuovo in Unix e Linux, cerca di non pubblicare immagini di testo, invece è meglio usare la formattazione del blocco di codice e copiarla dalla tua console. Ciò consente di cercare / copiare il testo / ecc. Nel caso del tuo esempio non ci sono davvero comandi complicati o qualsiasi cosa che sarebbe utile cercare, ma una buona pratica per altre risposte.
Centimane,

1
Non sono sicuro di comprendere appieno il tuo riferimento alla "vecchia domanda". È nell'elenco delle domande principali ed è pertinente con 60.000 visualizzazioni. Ho pensato che il valore aggiunto venisse dal formato, al contrario di un dialogo / congettura come le risposte precedenti. ma anche il formato è stato modificato. Terrò a mente i tuoi commenti sull'uso dei blocchi di codice, grazie.
Timothy LJ Stewart,

2
È in cima all'elenco delle domande "attive" perché hai pubblicato una risposta. La domanda è stata originariamente posta nel 2014 e ha accettato una risposta. La risposta accettata indica lo scopo .bashrce distingue la differenza tra .bashrce .bash_profileche copre il contenuto della risposta. Non scoraggiarti, fai uno sforzo onesto, ma cerca di concentrarti sulla risposta alle domande con alcuni contenuti non coperti da altre risposte.
Centimane,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.