我在看sudo -i/-s 这里的区别。使用命令后shopt,请注意all(sudo su/sudo -i/sudo -s)$SHELL提供相同的结果,但shopt命令结果不同。
那么,如何定义登录和非登录外壳?
从哪里shopt得到结果?
为什么不相关$SHELL?
苏多苏
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
须藤-i
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
须藤-s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
$SHELL(定义的)外壳程序(并将其连接到伪终端),该外壳程序又在您的/ etc / passwd条目中定义。此Shell是登录Shell,可以使用进行测试if [[ -o login ]]; then echo "I am a login shell"; fi。作为登录shell,它将执行适合于新会话的那些任务。例如源代码~/.zprofile或类似代码,它们可能会设置环境变量以及您此时可能希望运行的任何自定义外壳程序代码

.profile或等效操作)的shell实例,以及2.应该在登录时启动的shell用户,/etc/passwd或与之等效的定义。$SHELL包含后者,您的shopt输出将处理前者。通常,当(2)中的shell在登录时启动时,它以(1)所需的特定方式启动,因此含义是混淆的。