O prompt personalizado não é válido quando uma criança é executada

4

Eu tenho aprendido o bash, e ao fazê-lo eu brinquei com o arquivo .bash_profile para poder colocar mensagens de saudação, etc. Mais tarde eu acabei de remover essas mudanças. Mas depois de fazer isso minha configuração padrão de prompt se perdeu: originalmente, o prompt estava todo em negrito, e \w part era azul para que quando eu estivesse em um diretório profundamente aninhado o prompt não parecesse tão emaranhado. Eu acho que foi o padrão para o Ubuntu (me corrija se eu estiver errado), no entanto, como eu disse que se perdeu e meu prompt foi não-negrito e monocromático, resultando em uma confusão quando estou em diretórios longos nomeados.

Então, ontem à noite eu tentei personalizar meu prompt da maneira que mencionei acima. Funcionou bem depois que eu adicionei o código a .bash_profile

O código era assim:

export PS1="\[$(tput bold)\]\u@\h:\[$(tput sgr 0)\]\e[1;34m\w$ \e[m"

No entanto, se eu tentar executar outro shell bash no atual, o prompt não será formatado:

Isso é normal? Não é todo o objetivo de exportar uma variável para torná-la acessível a partir de todos os processos-filhos que são extraídos dessa shell? Por que isso não se aplica a essa situação?

    
por etka 21.08.2016 / 11:13

2 respostas

5

TL; DR : basta colocar a chamada em PS1 em ~/.bashrc ou chamar subshells com -l flag

A resposta de Zanna sugere apropriadamente para definir PS1 em ~/.bashrc como origem de shells interativos.

Você pode, no entanto, usar -l flag para tratar o subshell como shell de login:

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ echo "PS1='TEST$ '" > ~/.profile

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash
xieerqi@eagle:~$ exit

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash -l
TEST$ 

O "Porquê"

Is that normal? Isn't the whole point of exporting a variable to make it accessible from all the child processes forked from that shell? Why it doesn't apply to this stiuation?

Sim, esse é o comportamento esperado. Quando você exporta algo, as variáveis devem se propagar para baixo, para subcamadas.

xieerqi@eagle:~$ export VAR=303
xieerqi@eagle:~$ bash
xieerqi@eagle:~$ echo $VAR
303
xieerqi@eagle:~$ ksh
$ echo $VAR
303

O problema novamente é ~/.bashrc . O arquivo padrão ~/.bashrc possui linhas que substituem PS1 . Então, sua variável foi exportada, mas depois usa uma vez o shell interativo% soured~/.bashrc. O exemplo dessa situação foi observado por a resposta de Gilles em uma das perguntas em Unix Stackexchange .

Quanto a ~/.profile , na verdade, é incentivado a definir e exportar variáveis de ambiente de lá e é uma prática frequente.

Para responder ao comentário de Zanna sobre o motivo pelo qual o primeiro shell foi colorido, acredito que essa seja a causa:

When bash is invoked as an interactive login shell . . . it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. (from bash man page, emphasis added)

O que aconteceu é que, quando você faz login, bash encontra ~/.bash_profile e o origina como o primeiro arquivo encontrado. Os outros shells são shells não-login interativos, então somente ~/.bashrc é originado depois disso.

    
por Sergiy Kolodyazhnyy 21.08.2016 / 12:26
6

.bash_profile é originado apenas por shells de login. Ela foi obtida quando você efetuou login na sessão X e o ambiente herdado como @Serg explica detalhadamente. De alguma forma você tem gerenciado uma configuração na qual este ambiente não é sobrescrito por .bashrc , talvez configurando seu terminal para abrir um shell de login por padrão. Eu posso reproduzir o comportamento que você experimentou configurando meu terminal assim:

isso faz com que o shell abra como um shell de login, mas qualquer filho chamado será um shell de não-login e a origem .bashrc , não .bash_profile a menos que, como sugere o @Serg, o -l flag seja usado .

TL; DR
Se você quiser que o prompt personalizado seja originado por shells interativos, coloque o código em .bashrc

    
por Zanna 21.08.2016 / 11:54