我继续阅读有关交互式、非交互式、登录和非登录 shell 的文章。
(这是在读取 .bash* 文件的上下文中)。
我不明白每种类型的 shell 是什么,所以让我们从基础的开始。
如果我从我的 Mac 通过 ssh 连接到我的 ubuntu 机器,会启动什么类型的 shell?
答案1
如果你通过 SSH 进入你的 Ubuntu 机器,你会得到一个交互式登录 shell。区别如下:
交互式与非交互式:任何可以在提示符下输入的 shell 都是交互式的。事实上,许多脚本会测试
$PS1
保存提示字符串的变量,以确定它们是否是交互式的。如果 shell 正在执行 shell 脚本,则它是非交互式的。因此,如果您这样做
ssh yourbox.example.com
,您将获得一个交互式 shell(假设为默认设置),而如果您这样做ssh yourbox.example.com mighty_shellscript.sh
,您将得到一个非交互式 shell,并且您的 SSH 会话将在脚本终止时终止。登录与非登录:当您从控制台或远程(例如 SSH)登录时,或者当您将选项传递
-l
给 时bash
,您将获得登录 shell。否则(例如当您打开终端窗口时),您将获得非登录 shell。要测试某个 shell 是否为登录 shell,请检查其命令名是否
-bash
为bash
:ps -ef | grep [b]ash
答案2
您将获得一个交互式登录 shell。但不要认为这是理所当然的,请自行检查。
这告诉你你有一个登录 shell(来自man bash
):
# shopt | grep login
login_shell on
这说明你有一个交互式 shell,请查找i
(来自man bash
):
# echo $-
himBH
您获得的交互式登录 shell 已读取/etc/profile
和 之一~/.bash_profile
,~/.bash_login
如下~/.profile
所述man bash
:
当 bash 被调用为 交互式登录外壳或者使用 --login 选项作为非交互式 shell,如果文件 /etc/profile 存在,它首先从该文件读取并执行命令。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。 启动 shell 时可以使用 --noprofile 选项来抑制这种行为。
答案3
这SSH(1)手册页说,
如果命令被指定,它将在远程主机上执行,而不是在登录 shell 上执行。
和
当用户的身份被服务器接受后,服务器要么执行给定的命令,要么登录到机器并为用户提供远程机器上的普通 shell。
这些告诉我你获取的 shell 是一个登录 shell。
答案4
尝试这个命令。
[max@localhost ~]$ echo $SHELL /bin/bash
您之所以得到这个输出是因为您的 shell 类型存储在这个变量中SHELL
。
要了解您的环境变量,请输入此命令
[max@localhost ~]$ 环境 。 。 。 HOSTNAME=localhost.localdomain 外壳=/bin/bash 历史记录=1000 用户=最大 。 。 。
在输入时echo $SHELL
它将打印此处存储的任何值
每次启动时此值都会更新