Compreendendo .bashrc e .bash_profile

22

Em um servidor quando eu faço login como root, vejo .bashrc (Ubuntu 10.10).

No meu Mac, tenho um .bash_profile

O Ubuntu sempre tem apenas um arquivo .bashrc e não .bash_profile ? (Eu estou apenas confuso, perguntando, eu percebo que eles são diferentes o / s, mas talvez haja algum relacionamento de alguma forma?)

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

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

    
por Blankman 12.04.2012 / 19:03

2 respostas

31

Aliases de Bash devem estar nos arquivos .bash_aliases ou .bashrc em diretórios home individuais. Se você precisar criar aliases de bash globais, eles podem ir em /etc/bash.bashrc , mas geralmente é melhor adicioná-los aos arquivos .bash_aliases ou .bashrc em /etc/skel para que eles sejam herdados por usuários recém-criados.

É praticamente sempre errado definir um alias em .profile , .bash_profile ou /etc/profile .

Para entender por que, é preciso entender sob quais circunstâncias comandos de cada um desses arquivos são executados. Existem equívocos sobre isso, que eu abordei abaixo.

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

Aliases para usuários individuais

Especialmente se você usa uma GUI, a maioria de seus shells interativos provavelmente são shells que não são de login. Mesmo que você nunca use uma GUI, você provavelmente ainda usa shells não-login com alguma frequência. Você vai querer que seus aliases trabalhem nesses shells.

Especialmente se você fizer login não graficamente em um console virtual ou via SSH , você provavelmente usa shell de login por algum tempo. Então você quer que seus aliases trabalhem em shells de login interativos também.

Quando um shell interativo de não-login é iniciado , ele origina .bashrc no diretório pessoal do usuário. Por padrão no Ubuntu, cada usuário .bashrc se origina .bash_aliases , se existir.

  • Para fonte um arquivo é fazer com que seu conteúdo seja executado no shell atual . As alterações no ambiente de shell feitas em um arquivo que é originado persistem mesmo depois que todos os comandos no arquivo foram executados.

A leitura dos comentários no padrão .bashrc do Ubuntu revela que é oficialmente pretendido que os aliases entrem em .bashrc ou .bash_aliases . .bashrc já contém algumas definições de alias (execute grep '^[[:blank:]]*alias' ~/.bashrc para 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 os shells interativos login ? Em vez de .bashrc , a origem dos shells de login .profile .

  • ... A menos que .bash_login exista, ele será originado.
  • ... A menos que .bash_profile exista, então ele será originado.

No entanto, a boa notícia é que, por padrão, no Ubuntu, os comandos em .bashrc serão também executados em shells de login interativos porque o padrão .profile verifica se o o shell atual é bash (e se .bashrc existir) e, se for, origens .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 em .bash_aliases em seus diretórios iniciais (criando-o se ele já não existir). Essa é uma maneira simples e limpa de tornar as definições de alias permanentes no nível por usuário.

Os aliases não devem ser definidos em .profile porque eles permaneceriam indefinidos em shells que não são de login. Ao contrário de muito do ambiente de um shell bash, os aliases não são exportados para shells filho:

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 desktop faz com que .profile seja originado no login gráfico, mas:

  1. Isso não é necessariamente feito por um shell bash, então as definições de alias podem nem ser processadas, e mais importante
  2. mesmo que as definições de alias sejam processadas, elas não são passadas para processos filhos . Particularmente, eles não são passados para shells criados abrindo uma janela do Terminal!

Os aliases não devem ser definidos em .bash_profile (ou .bash_login ) pela mesma razão, mas também por outro motivo. Criando ingenuamente um desses arquivos e colocando apenas definições de alias, ele impede que qualquer código em .profile seja executado!

Em situações em que .bash_profile ou .bash_login é realmente útil, normalmente uma fonte é .profile em algum lugar, o que resolve esse problema. (Então, o único problema restante é que, como com .profile , a definição de aliases em .bash_profile ou .bash_login não funciona corretamente.)

Alias para Novo Usuários individuais, automaticamente

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

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

Se você editar um arquivo já existente em /etc/skel , talvez queira fazer o backup primeiro, mas não deve colocar o backup em /etc/skel ou ele também será copiado para os novos usuários. diretórios iniciais.

Esta é 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 alias em /etc/skel/.bash_aliases , poderá simplesmente direcioná-los para esse arquivo, que eles podem optar por copiar em seus diretórios iniciais (ou adicionar em seu próprio arquivo .bash_aliases personalizado).

É trivial para um usuário indefinir um alias. Além disso, os alias 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 , você não deve implementar esse comando como um alias. E você não consegue forçar aliases em usuários que não os querem - eles podem simplesmente unalias deles.

Aliases globais, para todos os usuários

Embora eu sugira que você evite essa abordagem, você pode definir aliases no arquivo global /etc/bash.bashrc . Eles serão então definidos tanto para shells interativos não-login como para shells de login interativos. A razão é que antes qualquer um dos arquivos no diretório inicial do usuário é originado:

  • Os shells de login (e apenas os shells de login e outros processos se comportando como shells de login) executam comandos de /etc/profile automaticamente.
  • Somente shells não-login executam comandos em /etc/bash.bashrc automaticamente, mas
  • O /etc/profile do padrão do Ubuntu verifica se o shell em execução é bash (e se existe /etc/bash.bashrc ) e, se for o caso, origina /etc/bash.bashrc .

Isso é análogo a como o padrão por usuário .profile origina o por usuário .bashrc se o shell for bash (conforme detalhado acima).

Veja 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, o% outer if verifica se o shell provavelmente é interativo (verificando se o texto do prompt não está vazio), então verifica se o shell atual é bash e se as origens são /etc/bash.bashrc e se não algum trabalho que, para o bash, já está feito em /etc/bash.bashrc .

Você deve não definir aliases globais em /etc/profile pela mesma razão que os usuários não devem defini-los em seus .profile s locais: se você fizer isso, eles serão definidos apenas para shells de login, e não para as cascas de seus filhos.

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

Leitura adicional

por Eliah Kagan 08.04.2015 / 20:32
5

Aqui estão algumas leituras divertidas . ".bash_profile é executado para shells de login, enquanto .bashrc é executado para shells interativos não-login"

Então, para o seu alias, use .bash_profile

    
por geermc4 12.04.2012 / 19:31

Tags