我理解交互式shell和非交互式shell之间的基本区别。但是,登录shell和非登录shell之间究竟有什么区别呢?
你能给出一些非交互式登录shell的使用示例吗?
登录shell是你登录进行交互式会话时,以你的用户ID执行的第一个进程。登录进程告诉shell以登录shell的方式运行,遵循一个惯例:将参数0(通常是shell可执行文件的名称)加上一个-
字符作为前缀(例如-bash
,而正常情况下是bash
)。登录shell通常会读取一个文件,这个文件会执行一些操作,比如设置环境变量:对于传统的Bourne shell是/etc/profile
和~/.profile
,对于bash还额外有~/.bash_profile
,对于zsh是/etc/zprofile
和~/.zprofile
,对于csh是/etc/csh.login
和~/.login
等。
使用命令 echo $0
即可区分当前 shell 是否是登录 shell。
当你通过文本控制台登录,或者通过SSH,或者使用su -
命令时,你会得到一个交互式登录shell。而当你在图形模式下登录(在X显示管理器上),你不会得到一个登录shell,相反,你会得到一个会话管理器或窗口管理器。
运行非交互式登录shell的情况很少见,但是一些X设置在通过显示管理器登录时会这样做,以便安排读取配置文件。其他设置(这取决于发行版和显示管理器)会显式读取/etc/profile
和~/.profile
,或者不读取它们。另一种获得非交互式登录shell的方法是通过标准输入远程登录并传递一个命令,而这个命令并不是来自终端的,例如,可以通过本地存储的脚本向服务器发送命令来实现:ssh example.com < my-script-which-is-stored-locally
(与ssh example.com my-script-which-is-on-the-remote-machine
这种方式相反,它运行的是一个非交互式的非登录shell)。
编写测试脚本 my-script-which-is-stored-locally 内容如下:
执行测试截图如下:
两者的主要区别在于它们启动的方式、执行的操作以及读取的配置文件。以下是它们之间的一些关键区别:
1.启动方式:
•登录Shell:当你通过文本控制台、SSH、或者使用su -
命令登录系统时,系统会启动一个登录Shell。登录Shell是用户登录系统后启动的第一个进程。•非登录Shell:当你在已经存在的会话中打开一个新的终端(例如在图形界面中打开一个新的终端窗口、在screen或tmux会话中打开一个新的窗口、在Emacs的终端缓冲区中打开一个新的Shell等)时,启动的是非登录Shell。
2.读取的配置文件:
•登录Shell:登录Shell会读取特定的配置文件来设置环境变量和执行其他初始化操作。对于Bash,这些文件通常是/etc/profile
、~/.bash_profile
、~/.bash_login
或~/.profile
。对于其他Shell,如Zsh或Csh,它们有各自的配置文件。•非登录Shell:非登录Shell通常不会读取登录Shell的配置文件。相反,它们可能会读取其他配置文件,如~/.bashrc
对于Bash、~/.zshrc
对于Zsh、~/.cshrc
对于Csh等。
3.参数传递:
•登录Shell:登录Shell在启动时会接收一个特殊的参数-
(dash),这告诉Shell它是一个登录Shell。例如,如果使用的是Bash,参数0会是-bash
。•非登录Shell:非登录Shell不会接收这个特殊的参数。
4.用途:
•登录Shell:通常用于用户登录系统时的初始会话,负责设置用户的工作环境。•非登录Shell:用于执行特定的命令或脚本,或者在已经存在的会话中打开新的Shell实例。
5.安全性:
•登录Shell:由于登录Shell是在用户登录时启动的,因此它通常会读取一些全局和用户的配置文件,这些文件可能包含敏感的环境变量和命令。•非登录Shell:由于它们不会读取登录Shell的配置文件,因此通常被认为更安全,尤其是在执行脚本或命令时。
总的来说,登录 shell 更像是一个完整的 shell 环境,它会加载更多设置,而这些设置通常是为长期的交互式使用设计的。非登录 shell 更倾向于快速执行任务,它不会加载那么多额外的设置。
•stackexchange 38175