Compreendendo .bashrc e .bash_profile

26

Em um servidor ao fazer login como root, vejo .bashrc(Ubuntu 10.10).

No meu Mac, tenho um .bash_profile

O Ubuntu sempre tem apenas um .bashrcarquivo e não .bash_profile? (Estou apenas confuso, então, perguntando, percebo que eles são diferentes, mas talvez haja um relacionamento de alguma forma?)

No meu servidor, quero criar um alias, devo colocá-lo .bashrc?

E se eu quiser que esse alias seja aplicado para que todos os usuários possam usá-lo?

Blankman
fonte
1
possivelmente duplicado de: askubuntu.com/questions/1528/bashrc-or-bash-profile - eu recomendo que você altere sua pergunta para apenas perguntar onde colocar apelidos globalmente.

Respostas:

39

Os aliases do Bash devem aparecer nos arquivos .bash_aliasesou .bashrcnos diretórios pessoais individuais. Se você deve criar aliases globais do bash, eles podem entrar /etc/bash.bashrc, mas geralmente é melhor simplesmente adicioná-los aos arquivos .bash_aliasesou para que sejam herdados pelos usuários recém-criados..bashrc/etc/skel

É quase sempre errado para definir um alias em em .profile, .bash_profileou /etc/profile.

Para entender o porquê, é preciso entender em que circunstâncias os comandos de cada um desses arquivos são executados. Existem conceitos errados sobre isso, que abordarei abaixo.

Mesmo que você queira definir aliases para vários usuários, você deve estar familiarizado com a forma como eles são definidos para usuários individuais, para que você possa decidir sobre o melhor método de fazer o que precisa.

Aliases para usuários individuais

Especialmente se você usar uma GUI, a maioria de seus shells interativos provavelmente são shells sem login . Mesmo que você nunca use uma GUI, provavelmente ainda usa shells sem login com alguma frequência. Você deseja que seus aliases funcionem nessas conchas.

Especialmente se você fizer logon não graficamente em um console virtual ou via SSH , provavelmente usará shell de login algumas vezes. Portanto, você deseja que seus aliases também funcionem em shells de login interativos.

Quando um shell interativo sem login é iniciado , ele é originado .bashrcno diretório inicial do usuário. Por padrão no Ubuntu, as .bashrcfontes de cada usuário .bash_aliases, se existentes.

  • Para fonte de um arquivo é fazer com que o seu conteúdo para ser executado no atual shell. As alterações no ambiente do shell feitas em um arquivo de origem persistem mesmo após a execução de todos os comandos no arquivo.

A leitura dos comentários no padrão do Ubuntu .bashrcrevela que se pretende oficialmente que os aliases sejam inseridos .bashrcou .bash_aliases. .bashrcjá contém algumas definições de alias (execute grep '^[[:blank:]]*alias' ~/.bashrcpara vê-las) e fornece conselhos explícitos sobre onde colocar novas definições:

# 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

Mas e as conchas de login interativas ? Em vez de .bashrc, faça o login na fonte dos shells .profile.

  • ... A menos que .bash_loginexista, ele será obtido.
  • ... A menos que .bash_profileexista, ele será obtido.

No entanto, a boa notícia é que, por padrão, no Ubuntu, os comandos também.bashrc serão executados em shells de logon interativo, porque o padrão .profileverifica se o shell atual é bash (e se .bashrcexiste) e, se houver, fontes .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Sugiro que os usuários definam novos aliases de bash .bash_aliasesem seus diretórios pessoais (criá-lo se ele ainda não existir). Essa é uma maneira particularmente limpa e simples de tornar as definições de alias permanentes no nível por usuário.

Os aliases não devem ser definidos,.profile pois permaneceriam indefinidos em shells sem logon. Ao contrário de grande parte do ambiente de um shell bash, os aliases não são exportados para shells filhos:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

Em particular, por padrão, a maioria dos ambientes de área de trabalho .profileé originada no logon gráfico, mas:

  1. Isso não é necessariamente feito por um shell bash; portanto, as definições de alias podem nem ser processadas e , mais importante
  2. mesmo se as definições de alias forem processadas, elas não serão repassadas para processos filho . Particularmente, eles não são repassados ​​para os shells criados pela abertura de uma janela do Terminal!

Os aliases não devem ser definidos em .bash_profile(ou .bash_login) pelo mesmo motivo, mas também por outro motivo. Ingenuamente, criar um desses arquivos e colocar apenas definições de alias impede que qualquer código .profileseja executado!

Em situações em que .bash_profileou .bash_loginrealmente é útil, normalmente uma fonte está .profileem algum lugar delas, o que resolve esse problema. (Então, o único problema restante é que, assim como .profile, definir aliases .bash_profileou .bash_loginnão funciona corretamente.)

Aliases para novos usuários individuais, automaticamente

Quando uma conta de usuário do tipo destinada a representar um ser humano real é criada, um novo diretório geralmente é criado para servir como seu diretório inicial. O conteúdo de /etc/skelé copiado para o diretório inicial. É assim que vários usuários começam com alguns arquivos de configuração semelhantes em seus diretórios pessoais. No Ubuntu, o que inclui .profile, .bashrce alguns outros arquivos.

Para alterar quais aliases são definidos para novos usuários, você pode simplesmente colocá-los /etc/skel/.bash_aliases(você precisará criá-lo) ou /etc/skel/.bashrc.

Se você editar um arquivo já existente, /etc/skelpoderá fazer backup primeiro - mas não deve colocar o backup /etc/skel, ou ele também será copiado nos diretórios pessoais de novos usuários.

Essa é provavelmente a melhor maneira de adicionar novos aliases para vários usuários. Os usuários existentes podem simplesmente adicionar os aliases. Se você definir os aliases em /etc/skel/.bash_aliases, poderá simplesmente direcioná-los para esse arquivo, que eles poderão optar por copiar em seus diretórios pessoais (ou adicionar em seu próprio .bash_aliasesarquivo personalizado ).

É trivial para um usuário definir um alias. Além disso, os aliases não são extremamente robustos ; eles trabalham apenas em circunstâncias particulares. Se você precisar criar um novo comando que funcione o tempo todo, para todos , não deverá implementar esse comando como um alias. E você não pode forçar com alias os usuários que não os desejam - eles podem simplesmente unaliasfazê-lo.

Aliases globais, para todos os usuários

Embora eu recomendo que você evite essa abordagem, você pode definir aliases no arquivo global /etc/bash.bashrc . Eles serão então definidos para shells interativos sem logon e para shells interativos. O motivo é que, antes que qualquer um dos arquivos no diretório inicial do usuário seja originado:

  • Os shells de login (e apenas shells de login e outros processos que se comportam como shells de login) executam comandos /etc/profileautomaticamente.
  • Somente shells sem login executam comandos /etc/bash.bashrcautomaticamente, mas
  • O padrão do Ubuntu /etc/profileverifica se o shell em execução é bash (e se /etc/bash.bashrcexistir) e, se houver, fontes /etc/bash.bashrc.

Isso é análogo ao modo como o usuário padrão .profileorigina o usuário .bashrcse o shell for bash (conforme detalhado acima).

Aqui está como é o código real para isso no padrão /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Esse bloco também executa outras tarefas. Especificamente, a ifverificação externa verifica se o shell provavelmente será interativo (verificando se o texto do prompt está vazio) e, em seguida, verifica se o shell atual é bash e as fontes, /etc/bash.bashrcse for, e se isso não funcionar, o bash , já está pronto em /etc/bash.bashrc.

Você não deve definir aliases globais /etc/profilepelo mesmo motivo que os usuários não devem defini-los em seus .profiles locais : se o fizer, eles serão definidos apenas para shells de logon e não para seus shells filhos.

Por fim, observe que, diferentemente do padrão por usuário .bashrc, o /etc/bash.bashrcarquivo padrão não contém nada sobre aliases. É um tanto incomum fornecer aliases aos usuários em um arquivo onde eles não podem editá-los ou desativá-los. (Claro, eles ainda podem fazer isso, substituindo suas definições em seu próprio local, .bashrc, .bash_aliases, ou em outro lugar.)

Leitura adicional

Eliah Kagan
fonte
5

Aqui está uma boa leitura sobre isso. ".bash_profile é executado para shells de login, enquanto .bashrc é executado para shells interativos de não login"

Portanto, para o seu alias, use .bash_profile

geermc4
fonte
4
Colocar aliases .bash_profilenão está correto. No Ubuntu, .profile(que é executado para shells de login), fontes .bashrcquando é um shell bash interativo. Assim, colocar aliases em .bashrc(ou .bash_aliasesoriginados .bashrc) os define em todos os shells bash interativos. Aliases em .bash_profileproduz esse problema , entre outros. Veja isto , aquilo , minha resposta e os ~/.bashrccomentários padrão recomendando colocar aliases lá ou dentro .bash_aliases.
Elias Kagan