Nenhuma saída colorida com a opção --login no bash

1

Eu não tenho saída colorida de ferramentas bash. E isso é muito inconveniente. (Btw, eu tenho cores em bash , por exemplo, prompt colorido).

Eu percebi que quando eu corro /usr/bin/bash , as cores voltam. (No entanto, não tenho minhas configurações de perfil, como aliases e caminhos).

Eu posso ver a única diferença aqui: --login flag. Acho que o motivo do problema está nos arquivos de configuração que são carregados no início com --login flag.

No entanto, o que pode ser?

    
por zhekaus 14.10.2017 / 10:06

1 resposta

1

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.)

    
por 16.10.2017 / 06:26

Tags