É ~ / .profile originado por bash?

3

Estou tentando criar uma variável de contador global para ver quantas vezes ~/.profile é executada. Assim:
Em ~/.bashrc :

# ... 
if [ "$PROFILE_EXEC_TIMES" = "" ]; then
 export PROFILE_EXEC_TIMES=0
fi
let "PROFILE_EXEC_TIMES += 1"

Em ~/.profile :

# ... 
export PROFILE_EXEC_TIMES
let "PROFILE_EXEC_TIMES += 1"

Mas quando eu abro um novo shell e escrevo echo $PROFILE_EXEC_TIMES , tudo que eu obtenho é 1 . $PROFILE_EXEC_TIMES deve ser pelo menos 2. Eu suspeito que ~/.profile não é originado pelo bash ... em caso afirmativo, o que preciso fazer para verificar quantas vezes ~/.profile é executado?

Editar:
Percebi que /etc/gdm/Xsession está obtendo ~/.profile pela seguinte linha:

test -f "$HOME/.profile" && . "$HOME/.profile"

e ~/.bashrc são originados em ~/.profile pelas seguintes linhas:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

Além disso, adicionei a seguinte linha a ~/.bashrc & amp; ~/.profile :

echo $(cd ${0%/*} && echo $PWD/${0##*/}) >> /home/myUserName/a

e pude ver que apenas uma linha foi adicionada ao arquivo depois que eu entrei no meu usuário.

Quero enfatizar que meu objetivo aqui é:
Descobrir quantas vezes ~/.profile é executado quando o usuário faz login.

Detalhes adicionais:

$ uname -a
Linux my-desktop 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux
$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.1 LTS"
por Dor 13.11.2010 / 22:03

5 respostas

5

De seus comentários sobre a minha resposta original, parece que a sua verdadeira pergunta é "Is ~ / .profile originado pelo GNOME?" A resposta é sim. Procure em /etc/gdm/Xsession :

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

Resposta Original

A partir do manpage do bash:

  

Quando o bash é invocado como um shell de login interativo ou como um   shell não interativo com o --login   opção, primeiro   lê e executa comandos do arquivo / etc / profile, se   o arquivo existe. Depois de ler esse arquivo,   procura por    ~/.bash_profile , ~/.bash_login e ~/.profile , nessa ordem, e   lê e executa comandos do   primeiro   que existe e é legível.

Assim, você pode ter um arquivo chamado .bash_profile ou .bash_login no seu diretório pessoal. Se algum destes existir, o bash irá usá-lo em vez de .profile.

    
por Ryan Thompson 13.11.2010 / 22:59
2

Primeiro, se você quiser observar o que está acontecendo em um shell script, coloque set -x no topo (logo após a linha #! , se houver). Isso imprime um traço da execução no erro padrão. Aqui, o erro padrão do shell deve ser redirecionado para ~/.xsession-errors .

Há uma contradição em sua pergunta: você diz que seu objetivo é "descobrir quantas vezes ~ / .profile é executado quando o usuário faz login" e, em seguida, você começa a hackear com .bashrc . Simplesmente colocar export PROFILE_EXEC_TIMES; let "PROFILE_EXEC_TIMES += 1" no seu .profile conta quantas vezes ele é originado, e não é surpreendente que o resultado seja 1 (você faz login apenas uma vez).

Seu .profile sources .bashrc , que é estranho como .profile é usado ao efetuar login e .bashrc é o arquivo de configuração do bash quando é interativo. Talvez você tenha feito isso para contornar um bug de design no bash, por meio do qual ele não lê .bashrc em um shell que é tanto um shell de login como interativo; Eu prefiro ter um .bash_profile que origina .profile e (se o shell for interativo) .bashrc .

Observe que seu .profile toma cuidado para não originar .bashrc se o shell não for bash. Isso explica porque .bashrc não é lido quando você efetua login: /etc/gdm/Xsession é executado por /bin/sh , que no Ubuntu 10.04 é dash , não é bash.

Perto da parte superior de .bashrc , você tem: “Se não estiver executando de forma interativa, não faça nada” comentando a linha [ -z "$PS1" ] && return . Na verdade, essa linha não fará isso; é bastante comum que PS1 seja definido em shells não interativos (por exemplo, é definido por /etc/profile ). Um teste confiável para uma festa interativa é [[ $- = *i* ]] .

Você também pode estar interessado em Diferença entre .bashrc e .bash_profile .

    
por Gilles 14.11.2010 / 12:59
2

@Dor: Ainda não tenho reputação suficiente para escrever comentários, mas posso responder-lhe o último comentário de 7 de dezembro de 2010 às 12:41, que foi:

"Quando eu adiciono o código aos dois arquivos e log no GNOME, ainda há uma única linha no arquivo Xsession.log (o arquivo Xsession.log está vazio antes de cada logon). Por que isso? pelo menos duas linhas no último caso. "

Não, porque quando você faz logon no Gnome (usando o GDM), ~/.bashrc NÃO é executado, apenas ~/.profile . Conforme explicado por Gilles, o Gnome chama /etc/gdm/Xsession , que, por sua vez, obtém ~/.profile . E ~/.profile SOMENTE fontes ~/.bashrc se estiver executando o bash .

De ~/.profile :

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

E quando você faz login no Gnome / GDM, você está não usando o Bash, porque, como Gilles também apontou, /etc/gdm/Xsession usa a diretiva #! /bin/sh , que no Ubuntu é um symlink para traço , não para bash.

Assim, todo o processo de login do Gnome não invoca o bash. É por isso que arquivos como / etc / profile, ~ / .bash_login, ~ / .bash_profile não são chamados automaticamente. É por isso que /etc/profile e ~/.profile tiveram que ser "manualmente", explicitamente fornecidos por /etc/gdm/Xsession . E os dois testam o Bash antes de pesquisar ~/.bashrc

O teste em "é shell interativo" em / etc / profile (e também em ~ / .bashrc) pode ser falho, mas o teste bash funciona , e retorna false ao efetuar login. É por isso que seu arquivo de log tem apenas uma linha ... isso é de ~/.profile

Quando você abre um terminal, é um terminal bash. O próprio Bash chama ~/.bashrc diretamente e ~/.profile não é executado.

Espero que agora tudo esteja esclarecido.

Por último, mas não menos importante: Não forneça o ~ / .profile de ~ / .bashrc , como sugerido pela resposta anterior. Isso causará uma referência circular (ambos os arquivos são fonte um do outro) e está técnica e conceitualmente errada. Isso pode causar problemas se o bash for usado para login (talvez no modo de texto, console de conserto?)

    
por MestreLion 19.02.2011 / 00:55
0

~/.profile é executado apenas para shells de login ( bash --login ), nem todas as shells, é para o que ~/.bashrc é. Portanto, a contagem de 1 deve estar correta, pois ~/.profile é executado uma vez quando você faz login.

Se você não confiar no contador de variáveis de ambiente, apenas escreva um arquivo com um nome de arquivo exclusivo (algo como $(uuidgen) ) para acompanhar as execuções de ~/.profile .

    
por Grumbel 13.11.2010 / 23:57
0

Você está obtendo .profile em .bashrc? Se não, Bash não vai ler. Você deve ter algo assim, provavelmente melhor colocado no topo do seu .bashrc:

[ -r ${HOME}/.profile ] && . ${HOME}/.profile

Isso fará com que o .profile exista e seja legível e, se for, processe-o.

    
por jgoguen 14.11.2010 / 03:17

Tags