相关博客
[Blog-1]: Base语法-Set命令与Shell选项设置
1.简介
什么是交互式Shell(Interactive Shell)?
交互式Shell:指直接与用户进行交互的 shell 实例,它允许用户输入命令并立即显示命令的输出结果。
特点:
- 启动时不包含非选项参数(除非使用 -s 调用选项来设置位置参数);
- 启动时不指定 -c 选项,其输入和错误输出都连接到终端(由
isatty(3)
决定); - 使用 -i 选项启动的 shell(执行
set -i
或bash -i script.sh
)。
如何确定?
要在启动脚本中确定 Bash 是否以交互方式运行,可以通过以下两种方式:
判断运行参数
-
的值中,是否包含i
。例如, 执行echo $-
命令,返回值为himBHs
(参数详细说明,见), 其中的i
说明shell以交互式运行。通过环境变量
PS1
判断, 此环境变量存在,则为交互式shell。
2.交互式Shell行为
当 Bash 以交互式模式运行时,它会在以下几个方面改变其行为:
- Bash启动文件。
启动时根据Bash启动文件
的规则,读取文件并执行; - 作业控制信号处理。
默认启用作业控制
,此时,Bash会忽略键盘的作业控制信号SIGTTIN
、SIGTTOU
、SIGTSTP
; - 提示符展开。
Bash在读取命令的第一行之前,展开并显示$PS1
;
在读取多行命令的第二行及后续各行之前,展开并显示$PS2
;
在读取命令后、执行命令前,会展开并显示$PS0
。
参见【注2】: “控制提示”(提示字符串转义序列的完整列表)。 PROMPT_COMMAND
执行。
Bash会在打印 主提示符$PS1
之前,将 数组变量PROMPT_COMMAND
中的元素作为命令来执行。
参见 “Bash变量”(由Bash设置、使用,其他 shell 通常不特别处理的变量)- Readline。
用于从用户终端读取命令。参见 【注4】:“命令行编辑Readline” ignoreeof
选项。
检查set -o
的 ignoreeof 选项的值。当ignoreeof
被设置时,标准输入端收到EOF
(非自定义终止符,而是快捷键Ctrl+D
发出的终止信号)时, 不再立即退出
(参见【注5】:“Set命令”(Bash的选项设置))。- 历史命令和展开。
默认开启命令历史记录
(参见【注6】:“History”(Bash 历史记录功能))、历史记录扩展
(参见【注7】:“History Expansion”(Bash 历史命令展开机制))。此时,shell退出时,Bash会将历史命令保存到名为$HISTFILE
的文件中。 - Alias别名展开。
默认执行别名展开。 - 信号处理。
没有任何traps
的情况下,Bash忽略SIGTERM
,捕获并处理SIGINT
信号。参见 【注8】:“Signals”(Bash对信号的处理) - 如果设置了
huponexit
选项,交互式Login-Shell会在退出时,向所有作业发生SIGHUP
信号。 - 选项
-n
被忽略。
交互式Shell下,选项-n
会被忽略,执行set -n
不会有任何效果(-n
:读取命令但不执行,用于检查脚本语法错误)。 - 邮件检查。
根据环境变量MAIL
、MAILPATH
和MAILCHECK
定期检查邮件。 - 以下报错会导致非交互模式shell退出,但交互式shell不会退出:
未定义变量的展开错误。
-u
(nounset):脚本引用未定义变量时,立即退出shell。用于避免因使用了未初始化变量而导致的错误。set -u
在交互式shell中的行为与非交互式shell中不同,引用未定义变量
时不在直接退出,而是回显报错信息${var:?word}
的展开错误。
在${var:?word}
展开中,变量未设置或为空时的展开错误不会导致 shell 退出。参见 【注9】:“Parameter Expansion”(Bash的参数展开)重定向错误。
由 shell 内置命令遇到的重定向错误不会导致 shell 退出。POSIX模式下的特殊内置命令返回错误。
在 POSIX 模式下,特殊内置命令返回错误状态不会导致 shell 退出。exec失败。
exec 失败不会导致 shell 退出。解析器语法错误。
解析器语法错误不会导致 shell 退出。
cdspell
选项。如果启用了 cdspell shell 选项,shell 会尝试对 cd 内置命令的目录参数进行简单的拼写校正。TMOUT
变量。检查 TMOUT 变量的值,并在打印 $PS1 后指定的秒数内未读取到命令时退出。
3.总结
Bash 在交互式模式下的行为变化,包括对信号的处理、提示符的展开、命令历史的使用、别名的展开等,这些特性使得 Bash 在交互式环境中更加灵活和用户友好。
4.参考
【注1】:linux-Interactive Shell(交互式Shell行为说明)
【注3】:“Bash变量”(由Bash设置、使用,其他 shell 通常不特别处理的变量)
【注4】:“命令行编辑Readline”
【注5】:“Set命令”(Bash的选项设置)