Por que $ 0 não é armazenado em um shell de login interativo?

2

Eu estava lendo sobre o bash interactive e em logins interativos e descobri que executar o bash com a opção -l irá iniciá-lo como shell de login, mas depois disso, quando executei o comando echo $0 para verificar, ele continua sendo non login concha.

[root@localhost ~]# bash -l
[root@localhost ~]# echo $0
bash

Ele deve mostrar - como prefixo para o nome do shell. Por favor, confirme se estou errado.

    
por Rajnish Kumar Soni 09.12.2016 / 10:09

1 resposta

4

Para ter um - como o primeiro caractere do nome do comando é apenas uma maneira de sinalizar um shell de login, existem outros sinais. Na verdade, a maneira correta de detectar que o shell atual é um shell de login é perguntar ao próprio shell.

No manual bash:

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

No bash:

shopt -p login_shell

Será impressa -u se o shell não for o login e -s se for.

Vamos testá-lo:

$ ln -s $(which bash) ./-bash       # make a local copy of bash
$ PATH=$PATH:.                      # Big security problem, don't use it.
$ -bash                             # start the local copy of bash
$ echo $0                           # Its name start with an -
-bash                               
$ shopt -p login_shell              # Is it a login shell?
shopt -s login_shell                # Yes!, the answer is -s

$ exit                              # leave the login shell
$ PATH=${PATH%:.}                   # Remove the local pwd from the path.
$ rm ./-bash                        # Remove the local copy of bash

Na verdade, esse $ 0 tem um - não tem que significar que o shell é um shell de login:

$  bash -c 'echo $0; shopt -p login_shell' -bash 1 2 3
-bash
shopt -u login_shell

A outra maneira (do manual) para obter um shell de login, é só pedir:

$ bash --login                 # ask for a login shell
$ echo $0                      # What is its name?
bash
$ shopt -p login_shell         # Is it a login shell?
shopt -s login_shell           # Yes, it is!

$ exit                         # leave the login shell.
    
por 09.12.2016 / 15:09

Tags