问题描述
据说非登录shell的设置要进入.bashrc
文件并登录shell设置进入.profile
文件。
login和非登录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
用户进行身份验证 -
使用
sudo login
命令切换用户
次佳解决办法
如果没有“technical jargon”,我认为不能给出正确答案。由于这个问题是第一个出现在谷歌查询“什么是登录shell”的问题,我在下面提供了一个更正确的答案:
登录shell只是一个被告知是登录shell的shell。它并不意味着在您登录后弹出的shell,但通常记录您的应用程序告诉shell它将启动为登录shell。有以下方法告诉shell它应该是一个登录的:
-
使用
-l
或--login
参数运行shell,假设它知道它(我不知道任何不知道-l
的shell,但只有几个shell支持--login
)。 -
将
argv[0]
的运行壳设置为-{some_string}
(即,将HYPHEN-MINUS添加到常用的argv[0]
或其他一些串中)。这就是ssh和su所做的:su只用-su
作为argv[0]
运行可执行文件(大家好以为argv[0]
与当前运行的可执行文件名称有关),当用户将/bin/zsh
设置为shell时,ssh运行zsh和-zsh
。
shell的loginess与任何要求您输入密码或执行其他身份验证程序的人完全无关。某些程序(如ssh或login(或某些终端模拟器,如urxvt))使用以HYPHEN-MINUS开头的argv[0]
运行shell作为登录。有些像su或sudo(或zsh:请参阅man zshmisc
中PRECOMMAND MODIFIERS部分中描述的-
预命令修饰符)默认情况下不这样做,但可以这样说。有些人可以选择使用其参数告诉shell为登录者(即bash -l
):带有命令参数的ssh(明确告诉ssh在远程端运行什么)。
通常最好首先查阅用于调用shell的程序的文档,以确定shell是否为登录shell,然后执行一些测试以确定app是否将启动登录shell(例如,通过将echo
添加到.profile
)。