什么是登录和非登录shell?

据说非登录shell的设置要进入.bashrc文件和登录shell设置进入.profile文件。

登录和非登录shell的真正含义是什么?

请尽量使用技术术语解释。

简单的说:

  • 如果您打开一个shell或终端(或切换到一个),它会要求您在提示之前登录(用户名?密码?),这是一个登录shell。
  • 如果它没有(像gnome-terminal ),并允许你直接使用它,它是一个非登录shell。

如果您是Ubuntu Desktop的普通用户,那么唯一的登录shell就是……您的桌面(您输入的密码是正确的;); 好吧,从技术上讲,它是一个启动GUI的登录shell,但这已经进入行话。 是的,它将读取.profile的设置

您(普通用户)可能只会看到一个看起来像登录shell的登录shell,如果您的桌面出现问题并且使用Ctrl + Alt + F1快捷键切换到虚拟终端。


拥有登录shell的其他一般情况包括:

  • 通过ssh远程访问您的计算机(或使用ssh localhost本地连接)
  • 使用bash -l (或sh -l )模拟初始登录shell
  • 使用sudo -i模拟初始root登录shell
    • sudo -u username -i为另一个非root用户
  • 使用su - username及其密码)作为另一个非root用户进行身份validation
  • 使用sudo login命令切换用户

如果没有“技术术语”,我认为不能给出正确的答案。 由于这个问题是第一个出现在谷歌查询“什么是登录shell”的问题,我在下面提供了一个更正确的答案:

登录shell只是一个被告知是登录shell的shell。 它并不意味着在您登录后弹出的shell,但通常记录您的应用程序告诉shell它将启动为登录shell。 有以下方法告诉shell它应该是一个登录的:

  1. 使用-l--login参数运行shell,假设它知道它(我不知道任何不知道-l shell,但是--login只支持几个shell)。
  2. 运行shell, argv[0]设置为-{some_string} (即HYPHEN-MINUS前置于通常的argv[0]或其他字符串)。 这就是ssh和su所做的:su只用-su作为argv[0]运行可执行文件(对于每个人都认为argv[0]与当前运行的可执行文件名称有关),当用户设置时ssh运行zsh和-zsh /bin/zsh作为他的shell。

shell的loginess与任何要求您输入密码或执行其他身份validation程序的人完全无关。 一些程序,如ssh或login(或某些终端模拟器,如urxvt)使用以HYPHEN-MINUS开头的argv[0]运行shell作为登录。 有些像su或sudo(或者zsh:see -man zshmisc PRECOMMAND MODIFIERS部分中描述的precommand修饰符)默认情况下不这样做,但可以这样说。 有些人有唯一的选择,即使用其参数告诉shell为登录者(即bash -l ):带有命令参数的ssh(明确告诉ssh在远程端运行什么)。

通常最好首先查看用于调用shell的程序的文档,以确定shell是否为登录名,然后执行一些测试以确定app是否将启动登录shell(例如,通过向.profile添加echo )。