I noticed when I run /usr/bin/bash, colors come back. (However, I don't have my profile settings such as aliases and paths).
Aparentemente, os comandos que configuram essas coisas só são executados para shells non -login.
Shells de login interativos usam scripts de inicialização diferentes de outros shells interativos.
Os comandos que configuram a saída colorida provavelmente estão no arquivo .bashrc
em seu diretório pessoal ou no sistema /etc/bash.bashrc
. Os comandos desses arquivos são executados para shells interativos que são not shells de login, mas não são executados a partir de shells de login interativos, a menos que um comando em um script de inicialização diferente obtenha .bashrc
. Você deve verificar esses arquivos.
Quando bash
inicia como um shell de login, ele executa comandos de /etc/profile
, bem como o primeiro de .bash_profile
, .bash_login
e .profile
que existe em seu diretório inicial. Execute man bash
para detalhes.
Os comandos em arquivos "profile" são executados mesmo em shells de login não-interativos para os quais você provavelmente não deseja configurar a colorização, e onde isso pode gerar erros. Em particular, a maioria dos ambientes de desktop executa comandos do seu arquivo .profile
. Então, se você adicionar comandos para colorização em um arquivo "profile", você deve considerar fazê-lo rodar apenas em shells interativos . Além disso, alguns de seus comandos só devem ser executados em bash
, mas não em outros shells, e você deve se certificar de que ainda é o caso (veja abaixo).
Uma maneira de determinar se um shell é interativo é verificar se a variável de prompt PS1
existe e não está vazia. Você pode colocar este comando após todos os comandos em um arquivo "profile" que você deseja executar mesmo para shells de login não-interativos, mas antes de qualquer comando que você queira executar em shells interativas:
[ -z "$PS1" ] && return
Às vezes, a verificação de interatividade pode estar no arquivo "rc".
Em alguns sistemas operacionais, incluindo o Debian e o Ubuntu , o Por padrão .profile
(copiado de /etc/skel/
quando uma conta de usuário é criada) fontes - isto é, executa todos os comandos de - .bashrc
. Da mesma forma, /etc/profile
sources /etc/bash.bashrc
. Nem todos os sistemas operacionais onde bash
é o shell padrão fazem isso, no entanto. Provavelmente o seu sistema não.
Nesses sistemas, o padrão .bashrc
e /etc/bash.bashrc
tem uma linha como essa no topo antes de qualquer outro comando . Especificamente, /etc/bash.bashrc
tem essa linha exatamente, enquanto .bashrc
verifica se o shell é interativo de uma maneira diferente:
case $- in
*i*) ;;
*) return;;
esac
Isso funciona porque um shell bash
interativo possui um i
no parâmetro especial $-
. Eu menciono isso principalmente no caso de você preferir checar dessa maneira.
Às vezes, pode fazer sentido fornecer condicionalmente um "rc" de um "perfil".
Dependendo da sua situação, você pode querer - por exemplo - fazer com que qualquer um dos arquivos "profile" em seu diretório home esteja sendo usado como fonte .bashrc
, como o Debian faz. Não posso aconselhá-lo a fazer isso porque depende do que você realmente tem em todos esses arquivos. Mas a maneira como o Debian e o Ubuntu fazem é assim:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Comandos em .bashrc
geralmente só podem ser executados por bash
, então você não deve configurar as coisas para que outras shells as executem inadvertidamente. Isso é o que o código acima alcança. Em .bash_profile
ou .bash_login
, você pode ter apenas . "$HOME/.bashrc"
, porque somente bash
usa .bash_profile
e .bash_login
. Mas em .profile
, você deve não ter um . "$HOME/.bashrc"
não protegido, porque outros shells do que bash
- e a maioria dos ambientes de desktop - também executam comandos de .profile
.
Você deve ter o mesmo cuidado se decidir fazer /etc/profile
source /etc/bash.bashrc
. E, em todos os casos, quando você usar o .
ou source
incorporado para obter um script de inicialização de outro ( .
e source
são intercambiáveis em bash
), certifique-se de não criar um loop infinito um arquivo origina outro, que origina o arquivo original.
O que você deve fazer ...
... é algo que não posso ter certeza com base nas informações que você forneceu, porque não sei quais arquivos eu mencionei acima e o que eles contêm.
Acredito que a descrição que dei deve ser suficiente para permitir que você descubra as alterações a serem feitas, mas talvez não tenha certeza de quais comandos de /etc/bash.bashrc
ou .bashrc
você deseja executar em login e não -login shells, e quais você quer manter apenas para shells não-login. (Ou talvez alguns deles - como configurar variáveis de ambiente como PATH
- você desejará executar somente para shells de login ).
Portanto, se por essa ou qualquer outra razão, você quiser uma resposta mais detalhada, recomendo que edite sua pergunta para fornecer essa informação: o nome, bem como o texto completo e exato, de cada um desses arquivos Você tem. (Outros usuários que estão procurando por ajuda com isso devem, é claro, não editar esta questão, mas devem postar novas perguntas se a solução não for encontrada pela primeira vez pela busca.)