Abri um terminal no Ubuntu usando Ctrl+ Alt+ Te um terminal diferente, acessando um diretório e clicando com o botão direito do mouse e escolhendo "Abrir no Terminal".
Eu fiz um echo $0
em ambos os casos.
No primeiro caso:
$ echo $0
-bash
No segundo caso:
$ echo $0
/bin/bash
Por que essa diferença?
bash
ubuntu
terminal
gnome-terminal
Código Azul
fonte
fonte
Respostas:
Se a saída do
echo $0
comando for,-bash
isso significa quebash
foi chamado como um shell de login. Se a saída for apenasbash
, você estará em um shell que não é de login.man bash
diz em algum lugar na linha 126:Veja mais sobre aqui: Diferença entre o Shell de Login e o Shell Não-Login? .
Agora, para explicar por que você entra
/bin/bash
no segundo caso, posso dizer que um programa (no seu caso, seu gerenciador de arquivos, provavelmente nautilus) ou um script pode mudar por conta própria$0
para outra coisa. Como exemplo, veja o que está acontecendo$0
no meu terminal (o mesmo terminal o tempo todo):fonte
A diferença está no modo como eles foram iniciados. O bash será inicializado de forma diferente (leia diferentes scripts de inicialização), dependendo do argumento [0]. Se a sequência começar com um hífen
-
como em-bash
seguida, será executada como um shell de logon, caso contrário, será executada como um shell interativo. Também pode ser executado como um shell não interativo (ou seja, em um script de shell).Para saber mais, é melhor ler o manual,
man bash
a seção INVOCATION.fonte
Um shell é iniciado quando você entra, mas também é iniciada por programas como
make
, ou quando você executar um script shell, ou quando você digita:sh
paravi
, ou quando você cria uma nova janela de terminal.Originalmente, o shell era lido
~/.profile
quando você fazia login ou era executadosu
. Esse script faria coisas como anunciar se você tinha um novo email, personalizar seus caracteres de apagar e matar e definir e exportar as variáveis TERM e PATH. Quando iniciado em quase qualquer outro contexto, o shell não leu~/.profile
, porque fazer a maioria dessas coisas seria redundante. Esperava-se que você exportasse quaisquer variáveis importantes do shell para o novo shell.A maneira como o shell sabia se deveria ler
~/.profile
era verificar se o primeiro caractere deargv[0]
, aka$0
, era'-'
.Começando com
csh
, os aliases foram introduzidos. Os aliases não foram exportados para o ambiente.csh
foi projetado para ler em dois scripts de inicialização diferentes.~/.login
era lida apenas quando um usuário fazia login, e a sugestão para isso era se fosseargv[0]
iniciada'-'
.~/.cshrc
foi lido toda vez que o shell foi iniciado. Em geral, colocamos aliases~/.cshrc
e tudo mais~/.login
.csh
também suportado~/.logout
, que na maioria dos casos apenas limpou a tela e foi executadofortune
.Outras conchas adotaram essas mesmas características.
ksh
leria~/.kshrc
,bash
leria~/.bashrc
, e era aí que você colocaria suas definições de alias.Portanto, para encurtar a história, o aplicativo que gera um shell decide se deve ser um "shell de login"; nesse caso, existe um
'-'
no início ou um shell comum. Na maioria dos casos, um shell que será interativo é iniciado como um shell de login, e um shell destinado apenas a executar alguns comandos, como argumentos ou a partir de um script, e sair é um shell comum.Mas tudo depende do capricho do aplicativo que inicia o shell.
fonte