Por que 'echo $ 0' fornece resultados diferentes para dois terminais diferentes?

15

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 $0em ambos os casos.

No primeiro caso:

$ echo $0
-bash

No segundo caso:

$ echo $0
/bin/bash

Por que essa diferença?

Código Azul
fonte
$ 0 retorna o nome do processo em execução.
Ramesh
Você executa dois terminais com usuário diferente?
7288 cuonglm
Eu uso o mesmo usuário
CodeBlue
3
pergunta semelhante askubuntu.com/questions/368509/why-is-0-set-to-bash
Avinash Raj
Na verdade, eles são emuladores de terminal diferentes ou apenas duas instâncias do mesmo emulador de terminal? Ambos são o terminal padrão?
terdon

Respostas:

16

Se a saída do echo $0comando for, -bashisso significa que bashfoi chamado como um shell de login. Se a saída for apenas bash, você estará em um shell que não é de login.

man bash diz em algum lugar na linha 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

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/bashno 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 $0para outra coisa. Como exemplo, veja o que está acontecendo $0no meu terminal (o mesmo terminal o tempo todo):

insira a descrição da imagem aqui

Radu Rădeanu
fonte
12

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 -bashseguida, 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 basha seção INVOCATION.

X Tian
fonte
9

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 :shpara vi, ou quando você cria uma nova janela de terminal.

Originalmente, o shell era lido ~/.profilequando você fazia login ou era executado su. 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 ~/.profileera verificar se o primeiro caractere de argv[0], aka $0, era '-'.

Começando com csh, os aliases foram introduzidos. Os aliases não foram exportados para o ambiente. cshfoi projetado para ler em dois scripts de inicialização diferentes. ~/.loginera lida apenas quando um usuário fazia login, e a sugestão para isso era se fosse argv[0]iniciada '-'. ~/.cshrcfoi lido toda vez que o shell foi iniciado. Em geral, colocamos aliases ~/.cshrce tudo mais ~/.login. cshtambém suportado ~/.logout, que na maioria dos casos apenas limpou a tela e foi executado fortune.

Outras conchas adotaram essas mesmas características. kshleria ~/.kshrc, bashleria ~/.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.

Mark Plotnick
fonte