Qual é o objetivo do .bashrc e como ele funciona?

Respostas:

131

.bashrcé um script de shell que o Bash executa sempre que é iniciado interativamente. Inicializa uma sessão de shell interativa. Você pode colocar qualquer comando nesse arquivo que possa digitar no prompt de comando.

Você coloca comandos aqui para configurar o shell para uso em seu ambiente específico ou para personalizar as coisas de acordo com suas preferências. Uma coisa comum a ser inserida .bashrcsão os aliases que você deseja sempre estar disponíveis.

.bashrcé executado em todo lançamento de shell interativo. Se você diz:

$ bash ; bash ; bash

e depois bateu Ctrl-Dtrês vezes, .bashrcserá executado três vezes. Mas se você diz isso:

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

então .bashrcnão será executado em tudo, desde que -cfaz a chamada Bash não-interativo. O mesmo acontece quando você executa um script de shell a partir de um arquivo.

Contraste .bash_profilee .profileque são executados apenas no início de um novo shell de login. ( bash -l) Você escolhe se um comando entra .bashrcvs, .bash_profiledependendo se você deseja que ele seja executado uma vez ou para cada início de shell interativo.

Como um contra-exemplo de alias, que prefiro incluir .bashrc, você deseja fazer PATHajustes .bash_profile, pois essas alterações geralmente não são idempotentes :

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

Se você colocar isso em seu .bashrclugar, toda vez que você lançar um sub-shell interativo, ele :/some/additionserá anexado ao final do PATHnovo, criando um trabalho extra para o shell quando você digitar um comando incorretamente.

Você começa um novo shell bash interativo sempre que desembolsar devi com :sh, por exemplo.

Warren Young
fonte
6
Quibble menor: diferente da maioria dos outros shells, o bash não carrega automaticamente o arquivo de configuração por instância .bashrcquando é iniciado como um shell de login. Às vezes, isso pode levar a um comportamento inesperado . A solução usual é a origem .bashrcde .profileou em .bash_profilevez disso.
Ilmari Karonen
@IlmariKaronen Como .bashrcnão se destina a ser usado por outros shells, é melhor não obtê- lo .profile(que pode ser usado por outros não bashshells).
Chepner 14/05
@IlmariKaronen o que acontece (leia-se: como posso depurar o porquê) quando source ~/.bashrcou . ~/.bashrcou [[ -f ~/.bashrc ]] && source. ~/.bashrcou [ -f ~/.bashrc ] && source ~/.bashrcnão funcionam?
Nikos Alexandris
@NikosAlexandris: Essa é uma pergunta separada. Por favor, pergunte separadamente .
22717 Warren Young
@ WarrenYoung eu gostaria, mas percebi que .bashrcé realmente de origem (usando o comando recomendado em superuser.com/a/183980/128768 ). O problema que enfrentamos é realmente o não fornecimento de https://github.com/junegunn/fzfatravés deste comando dentro .bashrc: source ~/.fzf.bash. Eu lancei um novo terminal, depois Ctrl+ Re recebo `__fzf_history__`bash: fzf: command not found. Eu .bashrcforneço manualmente e o mesmo atalho de tecla inicia o fzf conforme o esperado. Desculpas pelo barulho aqui.
Nikos Alexandris
20

O objetivo de um .bashrcarquivo é fornecer um local onde você possa configurar variáveis, funções e aliases, definir seu prompt (PS1) e definir outras configurações que você deseja usar sempre que abrir uma nova janela do terminal.

Funciona sendo executado sempre que você abre um novo terminal, janela ou painel.

Você pode ver o meu aqui (foto com destaque da sintaxe) :

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"

Explicação:

-1. Configure meu arquivo de histórico para ignorar duplicatas e ser muito maior que o padrão.
-2. Opção de cores para lsdependendo se você estiver usando linux ou OSX
-3. Função " md" para criar e cd em um diretório com um comando
-4. Encontre o ramo git atual se estiver em um repositório git e ...
-5. -9 Defina um prompt incrível do PS1, como em <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </code>
-10. Prompt PS2 aprimorado
-11. Defina vi como o editor na linha de comandos
-12. Defina vi como o editor padrão
-13. execute meu .bash_aliasesarquivo se ele existir
-14. Execute meu script de conclusão da guia git (para controles remotos e ramificações), se existir.
-15. Execute o salto automático, se existir
-16. Permitir cd'ing sem digitar a parte do CD se a versão bash> = 4
-17 Execute um script de conclusão do bash se existir
-18. Use o TMUX se estiver presente
-19. Adicione rvm ao meu PATH
-20. Use rvm, se existir.

Eu o tornei portátil para que ele funcione em qualquer uma das minhas máquinas Linux ou OSX sem personalização - portanto, vários testes de presença são feitos antes de usar determinadas funções e outros scripts.

Isso também facilita o uso de todo o arquivo imediatamente em uma nova máquina, sem problemas que afetam a abertura de uma nova janela do terminal.

Michael Durrant
fonte
Explicação ... ͏͏͏͏͏͏͏͏͏ #
019 Pacerier
Hã? muito útil para você?
Michael Durrant
2
Muito obrigado por compartilhar. Uma riqueza de informações aqui.
Vic
7

É um basharquivo de configuração.

Shell interativos (sem login), a configuração é lida a partir desses arquivos:

  • $HOME/.bashrc

Para shells de Login, a configuração é lida a partir desses arquivos:

  • /etc/profile (Sempre adquirido)
  • $HOME/.bash_profile (o restante desses arquivos é verificado em ordem até que um seja encontrado e nenhum outro é lido)
  • $HOME/.bash_login
  • $HOME/.profile

Ilustração simples de como / quando eles são carregados está na imagem abaixo.

Eu adicionei um echopara o meu .bashrce.bash_profile

Shell interativo vs shell de login

veja man bashpara mais informação

Timothy LJ Stewart
fonte
2
Isso realmente não agrega valor adicional a uma pergunta antiga. Além disso, vejo que você é novo no Unix e Linux, tente não postar imagens de texto; em vez disso, é melhor usar a formatação do bloco de código e copiar do seu console. Isso permite que o texto seja pesquisado / copiado / etc. No caso do seu exemplo, não existem realmente comandos complicados ou qualquer coisa que seria bom pesquisar, mas uma boa prática para outras respostas.
Centimane 15/09/16
1
Não sei se entendi completamente sua referência a 'pergunta antiga'. Ela está na lista das principais perguntas e é relevante com visualizações de 60k. Eu pensei que o valor agregado vinha do formato, em oposição a um diálogo / conjectura como as respostas anteriores. mas o formato também foi editado. Lembrarei de seus comentários sobre o uso de blocos de código, obrigado.
Timothy LJ Stewart
2
Está no topo da lista de perguntas 'ativas' porque você postou uma resposta. A pergunta foi originalmente feita em 2014 e aceitou uma resposta. A resposta aceita indica o objetivo .bashrce distingue a diferença entre .bashrce .bash_profileque cobre o conteúdo da sua resposta. Não desanime, você faz um esforço honesto, mas tente se concentrar em responder perguntas com algum conteúdo não coberto por outras respostas.
Centimane 15/09/16