bashrc ou bash_profile?

49

Eu sei a diferença entre os dois scripts de login do bash:

.bashrc é executado apenas por shells "sem login".

.bash_profile(ou .bash_loginou .profile) é executado por shells de "login".

Alguém tem alguns bons exemplos de quais são as melhores opções para execução somente de logon, de modo que eu apenas as coloquei .bash_profile, mas elas não fariam sentido .bashrc?

(Eu sei que a maioria de nós trabalha .bashrcfora .bash_profile, por isso não parece haver muito sentido na pergunta oposta ...)

Don Faulkner
fonte
3
Veja também a mesma pergunta em Super Usuário .
Gilles 'SO- stop be evil'

Respostas:

24

Como a .bashrcé para shells sem logon, evito quaisquer comandos que ecoem na tela. Também experimentei experiências nas quais as instruções echo .bashrcfarão com que os comandos sftp e rsync falhem (e talvez os comandos scp também).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

Além disso, você geralmente não executa o ssh-agent a partir de um shell não interativo. Então eu tenho isso .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Stefan Lasiewski
fonte
2
Se você usar ~ / .profile em vez de ~ / .bash_profile, as coisas ainda funcionarão, mesmo que você mude os shells. ~ / .Bash_profile é para itens específicos do bash.
LassePoulsen 7/08
1
Mas o bash só executará QUALQUER .bash_profile OU .profile, portanto, se você for usar os dois, precisará originar .profile de dentro do .bash_profile ou algo assim. Isso não é uma má idéia, na verdade ...
Don Faulkner
@ Source & @ Don: bons pontos. Eu costumava ter Bashisms no meu .bash_profile, mas agora mudei para algo mais universal. Talvez esteja usando o .profile.
Stefan Lasiewski
Em relação aos comandos de produção de saída, .bashrcinterferindo nos métodos de transferência remota de arquivos implementados por meio de fluxos padrão , a solução é colocar esses comandos no código que verifica se o shell é interativo e continua apenas se for. Os .bashrcarquivos padrão dos usuários no Ubuntu, copiados /etc/skel/.bashrcapós a criação da conta, bem como em todo o sistema /etc/bash.bashrc, já contêm código que verifica e retorna se o shell não é interativo (embora ainda seja necessário colocar sob comando os comandos de produção de saída ).
Elias Kagan 19/11
8

Byobu é um ótimo exemplo de algo que você nunca deve colocar em um .bashrc.

Caso contrário, ele será executado recursivamente em todos os seus 'terminais virtuais' ;-)

Você pode tentar, porém, é divertido.

É por isso que você o coloca .profile, para que o byobu (que realmente é apenas um invólucro na tela) seja carregado apenas uma vez no momento do login. E o próprio byobu pode iniciar novas sessões de bash interativas.

Ralf
fonte
Esse é um bom exemplo. Obrigado pelo ponteiro para Byobu também. Agora, experimente.
quer tocar hoje