Por que 'echo $ 0' fornece um resultado diferente para dois terminais diferentes?

13

Eu abri um terminal no Ubuntu usando Ctrl + Alt + T e um terminal diferente indo para um diretório e clicando com o botão direito 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?

    
por CodeBlue 07.02.2014 / 17:19

3 respostas

15

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

man bash diz 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 aqui: Diferença entre o login shell e o não-login shell? .

Agora, para explicar por que você recebe /bin/bash no segundo caso, posso dizer que um programa (no seu caso, seu gerenciador de arquivos, provavelmente nautilus) ou um script pode alterar seu próprio $0 para outra coisa. Como exemplo, veja o que está acontecendo com $0 no meu terminal (o mesmo terminal o tempo todo):

    
por 07.02.2014 / 18:32
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 de sua argv [0]. Se a cadeia começar com um hífen - como em -bash , ela será executada como um shell de login, caso contrário, ela será executada como um shell interativo. Ele 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 da seção INVOCATION.

    
por 07.02.2014 / 17:32
8

Um shell é iniciado quando você faz login, mas também é iniciado por programas como make ou quando você executa um script de shell ou quando você digita :sh to vi ou quando cria uma nova janela de terminal .

Originalmente, o shell lia em ~/.profile quando você efetuava login ou executava su . Esse script faria coisas como anunciar se você tinha um novo e-mail, personalizaria sua exclusão e mataria caracteres e configuraria e exportaria as variáveis TERM e PATH. Quando iniciado em quase qualquer outro contexto, o shell não leu ~/.profile , porque a maioria dessas coisas seria redundante. Era esperado que você exportasse quaisquer variáveis importantes do shell para o novo shell.

A maneira como o shell sabia se deveria ler em ~/.profile era verificar se o primeiro caractere de argv[0] , também conhecido como $0 , era '-' .

Começando com csh , os aliases foram introduzidos. Os aliases não foram exportados no ambiente. csh foi projetado para ler dois scripts de inicialização diferentes. ~/.login foi lido somente quando um usuário efetuou login e a sugestão para isso foi se argv[0] começou com '-' . ~/.cshrc foi lido toda vez que o shell foi iniciado. Em geral, um colocou alias em ~/.cshrc e tudo mais em ~/.login . csh também suportou ~/.logout , que na maioria dos casos apenas limpou a tela e executou fortune .

Outros shells adotaram esses mesmos recursos. ksh leria em ~/.kshrc , bash leria em ~/.bashrc , e onde 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", caso em que há o '-' no início ou um shell normal. Na maioria dos casos, um shell que será interativo é iniciado como um shell de login, e um shell significa apenas executar alguns comandos, como argumentos ou de um script, e então exit é um shell regular.

Mas tudo depende do capricho do aplicativo que inicia o shell.

    
por 07.02.2014 / 18:24