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