为什么交互式登录 shell 中的 $0 不是 -bash?

为什么交互式登录 shell 中的 $0 不是 -bash?

我正在阅读有关 bash 交互式和交互式登录的信息,发现使用-l选项运行 bash 会将其作为登录 shell 启动,但这样做后,当我运行命令echo $0进行验证时,它仍然显示为非登录 shell。

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

它应该显示-为 shell 名称的前缀。请确认我是否出错。

答案1

将 an-作为命令名称的第一个字符只是向登录 shell 发出信号的一种方式,还有其他信号。事实上,检测当前 shell 是否为登录 shell 的正确方法是询问 shell 本身。

在 bash 手册中:

登录 shell 的参数零的第一个字符是 -,或者以 --login 选项开头。

在bash中:

shopt -p login_shell

-u如果 shell 未登录,则打印-s

让我们测试一下:

$ 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

事实上,$0 有一个 - 并不一定意味着该 shell 是登录 shell:

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

另一种获取登录 shell 的方法(来自手册)就是要求它:

$ 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.

答案2

登录 shell 可以是以下两个之一:
1- 参数零的第一个字符是“-”
2- 使用 --login 选项调用

> echo $0
=if=> -bash # login shell.
=if=> bash  # we don't know nothing!!!
> shopt -p login_shell
=if=> shopt -s login_shell # login shell.
=if=> shopt -u login_shell # non-login shell

另一种方法(这是一种丑陋的方法!)是从当前 shell 退出,如果您的 shell 已登录,输出将是注销,如果不是,则只是退出:

> bash
> shopt -p login_shell
shopt -u login_shell
> exit
exit # it says exit

> bash -l
> shopt -p login_shell
shopt -s login_shell
> exit
logout # it says logout

并且您不能logout从非登录 shell

相关内容