Cygwin64: Confuso sobre quando o /etc/bash.bashrc é executado?

1

Eu tenho o Windows 7 64-bit PC. Eu instalei o Cygwin versão 2.6.0 nele no diretório c: \ cygwin64.

Estou confuso que quando abro o Terminal Cygwin64, o arquivo de configuração /etc/bash.bashrc é executado?

Acho que esse é um shell de login interativo, de acordo com meu entendimento /etc/bash.bashrc nunca é executado. Aqui está o link do meu entendimento: link

Mas no arquivo /etc/bash.bashrc eu posso ver a variável de ambiente PS1 está definida. E é o mesmo valor que recebo quando uso o comando echo $PS1 . Então, isso significa que /etc/bash.bashrc foi executado?

Eu posso não estar entendendo corretamente "login interativo" e "não-login interativo". Qualquer ajuda é muito apreciada.

Obrigado

    
por ChumboChappati 22.01.2017 / 00:49

3 respostas

1

Quando eu abro o Terminal Cygwin64, o /etc/bash.bashrc é executado?

Resposta curta:

Sim. Eu adicionei algumas instruções de eco aos arquivos de inicialização do bash e abri um Terminal Cywin64. Aqui está a saída:

/etc/bash.bashrc
/home/DavidPostill/.bash_profile
.profile
/home/DavidPostill/.bashrc
/home/DavidPostill/.bashrc
$

Por algum motivo ~/.bashrc é chamado duas vezes, no momento não tenho certeza do motivo.

Longa Resposta:

O atalho para o Terminal Cygwin64 executa o seguinte comando:

C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico -

A ajuda para mintty afirma:

$ mintty --help
Usage: mintty [OPTION]... [ PROGRAM [ARG]... | - ]

Start a new terminal session running the specified program or the user's shell.
If a dash is given instead of a program, invoke the shell as a login shell.

Assim, podemos ver que o comando - no comando de atalho faz com que um shell de login seja executado.

O que acontece a seguir depende do seu shell de login está definido.

Assumindo que esteja definido como bash , então:

  • Se for um shell de login, o Cygwin executará ~/.bash_profile , se existir, ou ~/.profile .

    Observe que .bash_profile executará ~/.profile

  • Se for um shell interativo, o Cygwin executará ~/.bashrc

.profile (other names are also valid, see the bash man page) contains bash commands. It is executed when bash is started as login shell, e.g. from the command bash --login. This is a useful place to define and export environment variables and bash functions that will be used by bash and the programs invoked by bash. It is a good place to redefine PATH if needed. We recommend adding a ":." to the end of PATH to also search the current working directory (contrary to DOS, the local directory is not searched by default). Also to avoid delays you should either unset MAILCHECK or define MAILPATH to point to your existing mail inbox.

.bashrc is similar to .profile but is executed each time an interactive bash shell is launched. It serves to define elements that are not inherited through the environment, such as aliases. If you do not use login shells, you may want to put the contents of .profile as discussed above in this file instead.

Fonte Como personalizar o bash

    
por 22.01.2017 / 02:03
0

Esta resposta explica bem a diferença entre login e não-login. Para resumir, no Cygwin, você já está logado e apenas abre uma nova janela de terminal. É o mesmo que se você abrisse um emulador de terminal em um desktop linux ou estivesse usando screen .

    
por 22.01.2017 / 01:02
0

Quando você abre o terminal do cygwin, é sempre "login interativo". Veja c:\cygwin\cygwin.bat que contém bash --login -i .

De acordo com o manual de bash :

"If the -i option is present, the shell is interactive."

e "--login" é

"Make bash act as if it had been invoked as a login shell".

O que você está perguntando sobre /etc/bash.bashrc - é o arquivo de inicialização do sistema bashrc que pode ser substituído pelo local ~/.bashrc ou aplicado caso o diretório de usuários não tenha ~/.bashrc . Quando você já estiver no terminal do cygwin e tentar executar bash - não é login já que você já efetuou login, mas é uma sessão interativa porque você chamou bash do script. Se você vai chamar bash do script como

#!/bin/bash

echo "Hello SuperUser"

então é invocação de login não interativa e não. Dessa forma, bash não lerá bashrc .

Leia a seção "invocação" no manual oficial da bash para entender melhor como bash interpretam ~/.bash_profile , ~/.bash_login , ~/.profile , /etc/bash.bashrc , ~/.bashrc e ordena que seja usado.

    
por 22.01.2017 / 09:21