![为什么交互式登录 shell 中的 $0 不是 -bash?](https://linux22.com/image/100573/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BA%A4%E4%BA%92%E5%BC%8F%E7%99%BB%E5%BD%95%20shell%20%E4%B8%AD%E7%9A%84%20%240%20%E4%B8%8D%E6%98%AF%20-bash%EF%BC%9F.png)
我正在阅读有关 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