6.3 交互式shell

评论 0 浏览 0 2023-01-26

1 什么是交互式shell?

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

交互式shell通常从用户的终端机中读取和写入。

-s调用选项可用于在启动一个交互式shell时设置位置参数。

2 这是交互式shell吗?

要在启动脚本中确定Bash是否在交互式运行,可以测试‘-’特殊参数的值。 当shell是交互式时,它包含i。例如:

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

另外,启动脚本可以检查变量PS1;它在非交互式shell中没有设置,而在交互式shell中设置。因此:

if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi

3 交互式shell行为

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

  1. 启动文件是按照6.2 Bash的启动文件中的描述来读取和执行的。
  2. 作业控制(见7 作业控制)默认是启用的。当工作控制生效时,Bash会忽略键盘产生的工作控制信号SIGTTINSIGTTOUSIGTSTP
  3. Bash在读取命令的第一行之前展开并显示PS1,在读取多行命令的第二行和后续行之前展开并显示PS2。 Bash在读取命令之后但在执行命令之前展开并显示PS0。 参见6.9 控制提示符,以获得提示字符串转义序列的完整列表。
  4. Bash在打印主提示符$PS1之前,将PROMPT_COMMAND数组变量的集合元素的值作为命令来执行(见5.2 Bash 变量)。
  5. Readline(见8 命令行的编辑)用于从用户终端读取命令。
  6. Bash在读取命令时,当它在标准输入上收到EOF时,会检查ignoreeof选项的值,以set -o,而不是立即退出(见1 Set 内置程序)。
  7. 命令历史(见9.1 Bash 历史工具)和历史扩展(见9.3 历史扩展)默认为启用。 当启用了历史的shell退出时,Bash会将命令历史保存到由$HISTFILE命名的文件。
  8. 默认情况下,会进行别名扩展(见6.6 别名)。
  9. 在没有任何陷阱的情况下,Bash会忽略SIGTERM(见6 信号)。
  10. 在没有任何陷阱的情况下,SIGINT会被捕获和处理(见6 信号)。SIGINT会中断一些shell的内置程序。
  11. 如果huponexit shell选项已被启用,交互式登录shell会在退出时向所有作业发送一个SIGHUP(见6 信号)。
  12. -n调用选项被忽略,‘set -n’没有任何作用(见1 Set 内置程序)。
  13. Bash将定期检查邮件,这取决于MAILMAILPATHMAILCHECK这些shell变量的值(见5.2 Bash 变量)。
  14. 在‘set -u’被启用后,由于对未绑定的shell变量的引用而导致的扩展错误不会导致shell退出(参见1 Set 内置程序)。
  15. var${var:?word}扩展中未设置或为空时,shell将不会退出扩展错误(见3 Shell参数扩展)。
  16. shell内置程序遇到的重定向错误不会导致shell退出。
  17. 当在POSIX模式下运行时,返回错误状态的特殊内置程序将不会导致shell退出(参见6.11 Bash的POSIX模式)。
  18. 一个失败的exec不会导致shell退出(见4.1 Bourne Shell内置程序)。
  19. 解析器的语法错误不会导致shell退出。
  20. 如果启用了cdspell shell选项,shell将尝试对cd内建程序的目录参数进行简单的拼写修正(参见2 Shopt 内置程序中对shopt内置程序的cdspell选项的描述)。 cdspell选项只在交互式shell中有效。
  21. shell将检查TMOUT变量的值,如果在打印完$PS1后,在指定的秒数内没有读到命令,则退出(见5.2 Bash 变量)。
最后更新2023-03-17
0 个评论