Bash学习 - 第6章:Bash Features,第3节:Interactive Shells

本文为 Bash Reference Manual第6章:Bash Features 第3节:[Interactive Shells](https://www.gnu.org/software/bash/manual/bash.html#Interactive-Shells 的读书笔记。

完整的笔记目录参见Bash学习笔记总目录

6.3 Interactive Shells

6.3.1 What is an Interactive Shell?

交互式 shell 是在没有非选项参数启动(除非指定了 -s)并且未指定 -c 选项的情况下启动的,其输入和错误输出都连接到终端(由 isatty(3) 确定),或者是在使用 -i 选项启动的情况下启动的。

交互式 shell 通常从用户的终端读取输入并输出内容。

启动交互式 shell 时,可以使用 -s 调用选项来设置位置参数。

6.3.2 Is this Shell Interactive?

要在启动脚本中判断 Bash 是否以交互模式运行,可以测试特殊参数 '-' 的值。当 shell 处于交互模式时,它包含 i。例如:

bash 复制代码
case "$-" in
*i*)	echo This shell is interactive ;;
*)	echo This shell is not interactive ;;
esac

示例:

bash 复制代码
$ echo $-
himBHs

$ cat isix.sh
case "$-" in
*i*)    echo This shell is interactive ;;
*)      echo This shell is not interactive ;;
esac

$ bash -c ./isix.sh
This shell is not interactive

或者,启动脚本可以检查变量 PS1;在非交互式 shell 中该变量未设置,在交互式 shell 中则已设置。因此:

bash 复制代码
if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi

6.3.3 Interactive Shell Behavior

当 shell 以交互模式运行时,它会以多种方式改变其行为。

  1. Bash 会按照 Bash 启动文件中描述的方式读取并执行启动文件。
  2. 默认情况下启用作业控制 (见作业控制)。当作业控制生效时,Bash 会忽略键盘生成的作业控制信号 SIGTTIN、SIGTTOU 和 SIGTSTP。
  3. Bash 会在打印主提示符 $PS1(见 Bash 变量)之前,将 PROMPT_COMMAND 数组变量中已设置元素的值作为命令执行。
  4. Bash 在读取命令的第一行之前会展开并显示 PS1,在读取多行命令的第二行及后续行之前会展开并显示 PS2。Bash 在读取命令后但在执行命令之前会展开并显示 PS0。有关提示字符串转义序列的完整列表,请参见"控制提示符"。
  5. Bash 使用 Readline(参见命令行编辑)从用户的终端读取命令。
  6. Bash 检查 ignoreeof 选项的值,以便在读取命令时在遇到标准输入的 EOF 时设置 -o,而不是立即退出(参见 Set 内建命令)。
  7. Bash 默认启用命令历史(参见 Bash 历史功能)和历史扩展(参见历史扩展)。当启用历史的 shell 退出时,Bash 会将命令历史保存到 $HISTFILE 指定的文件中。
  8. 别名扩展(参见别名)默认会执行。
  9. 如果没有任何陷阱,Bash 会忽略 SIGTERM(参见信号)。
  10. 如果没有任何陷阱,SIGINT 会被捕获并处理(参见信号)。SIGINT 会中断某些 shell 内建命令。
  11. 如果启用了 huponexit shell 选项(参见信号),交互式登录 shell 退出时会向所有作业发送 SIGHUP。
  12. -n 选项没有任何效果,无论是在调用时还是使用 'set -n' 时(参见 内置命令 set)。
  13. Bash 会定期检查邮件,这取决于 MAIL、MAILPATH 和 MAILCHECK 这几个 shell 变量的值(参见 Bash 变量)。
  14. 启用 'set -u' 后,shell 在展开引用未绑定的 shell 变量时不会退出(参见 内置命令 set)。
  15. ${var:?word} 展开中,如果 var 未设置或为空导致展开错误,shell 也不会退出(参见 Shell 参数展开)。
  16. 由 shell 内置命令遇到的重定向错误不会导致 shell 退出。
  17. 在 POSIX 模式下,返回错误状态的特殊内置命令也不会导致 shell 退出(参见 Bash 和 POSIX)。
  18. 执行失败的 exec 不会导致 shell 退出(参见 Bourne Shell 内置命令)。
  19. 解析器语法错误不会导致 shell 退出。
  20. 如果启用了 cdspell shell 选项,shell 将尝试对 cd 内建命令的目录参数进行简单的拼写纠正(参见 The Shopt Builtin 中 shopt 内建命令的 cdspell 选项说明)。cdspell 选项仅在交互式 shell 中有效。
  21. shell 会检查 TMOUT 变量的值,如果在打印 $PS1 后指定的秒数内未读取到命令,则退出(参见 Bash 变量)。
相关推荐
追夢秋陽4 小时前
MacOS app打包Dmg线下分发测试及公证shell脚本
macos·shell·dmg·cocoa打包·打包脚本
袁袁袁袁满5 小时前
Linux怎么创建Shell脚本.sh文件
linux·运维·服务器·shell·shell脚本.sh文件·创建shell脚本·创建.sh文件
之歆18 小时前
Shell 命令与基础完全指南
shell
鸠摩智首席音效师4 天前
如何在Bash中捕获标准错误到一个变量 ?
bash
dingdingfish5 天前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
xuchaoxin13755 天前
bash@脚本中的命令行参数解析基础@shift命令@getopts
bash
礼拜天没时间.5 天前
自定义镜像制作——从Dockerfile到镜像
linux·docker·容器·centos·bash
源文雨5 天前
shell调用ffmpeg递归转换所有wav至flac的脚本
ffmpeg·bash·音视频·音频·unix·shell·音频编码
Sheep Shaun6 天前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制