交互式shell和非交互式shell、登录shell和非登录shell:
我们在图形交互界面操作时,是交互式的,先理解交互式下的登陆和非登录概念:
概念 | 举例 | 特点 |
---|---|---|
登陆shell | 用户登陆时,输入用户名和密码登陆的shell,或bash --login 命令打开的shell | 登陆时读取并执行/etc/profile ·和~/.bash_profile、~/.bash_login、~/.profile 中第一个存在的文件,通常这三个文件中会source ~/.bashrc 。登出时执行~/.bash_logout |
非登陆shell | 用户登陆时不需要系统认证打开的shell,或bash 命令打开的shell | 登陆时读取并执行~/.bashrc |
我们时常远程执行脚本或者 (sh some.sh
或 ./some.sh
)直接执行脚本时会遇到缺少环境变量的问题,其实就是因为我们使用的是非交互式非登录shell。该模式下,加载的$BASH_ENV
定义的文件。
命令bash启动shell时,是可以通过选项改变其行为的,(sh 基本兼容bash这些设定)
bash [长选项] [选项] [脚本]
常用选项:
选项 | 含义 |
---|---|
-i | shell在交互模式下运行 |
-l | shell作为登陆shell |
-r | 启动受限shell |
-- | 选项结束标志,后面的内容当做文件名或参数,即使他们以- 开头 |
--login | 同-l |
--noprofile | 阻止读取初始化文件/etc/profile、~/.bash_profile、~/.bash_login、~/.profile |
--norc | 在交互式shell,阻止读取初始化文件~/.bashrc 。如果shell以sh调用的话,该选项默认是打开的。 |
--recfile file | 在交互式shell,指定初始化文件是file而不是~/.bashrc |
--version | 版本信息 |
查看登录式:shopt login_shell
# 如新起一个bash:
> bash
> shopt login_shell
login_shell off
> bash --login
> shopt login_shell
login_shell on
# ssh 一个ip
ssh xxxxxxx
> shopt login_shell
login_shell on
查看交互式法1:echo $PS1
# 非空表示交互式
> echo $PS1
\u@\h:\w>
> cat test.sh
echo $PS1
shopt login_shell
> sh test.sh
login_shell off
查看交互式法2:echo $-
# 输出中包含i
则表示是交互式shell
> echo $-
himBH
> cat test.sh
echo $-
shopt login_shell
> sh test.sh
hB
login_shell off
> bash -i test.sh
himB
login_shell off
> sh -i test.sh
himB
login_shell off