Bash 检查 Linux / Unix OS 下的 Shell 是否为交互式的
编写 shell 脚本时,如何在 GNU/Bash 中检查 shell 是否以交互模式运行?
当 bash shell 从用户终端读取和写入数据时,它被视为交互式 shell。大多数启动脚本都会检查名为 PS1 的 shell 变量。通常,PS1 在交互式 shell 中设置,在非交互式 shell 中取消设置。
当 bash shell 从用户终端读取和写入数据时,它被视为交互式 shell。大多数启动脚本都会检查名为 PS1 的 shell 变量。通常,PS1 在交互式 shell 中设置,在非交互式 shell 中取消设置。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | 猛击 |
操作系统兼容性 | BSD • Linux • macOS • Unix • WSL |
预计阅读时间 | 2 分钟 |
检查该 shell 是否能与 PS1 交互
语法如下:
// Is this Shell Interactive? [ -z "$PS1" ] && echo "Noop" || echo "Yes"
以下是我们的另一个捷径:
[ -z "$PS1" ] && echo "This shell is not interactive" || echo "This shell is interactive" ## do some stuff or die ## [ -z "$PS1" ] && die "This script is not designed to run from $SHELL" 1 || do_interacive_shell_stuff
您可以使用 bash shell if..else..fi 语法,如下所示:
if [ -z "$PS1" ]; then die "This script is not designed to run from $SHELL" 1 else //call our function do_interacive_shell_stuff fi
这个 shell 是交互式的吗?
来自 bash(1) 参考手册:
要在启动脚本中确定 Bash 是否以交互方式运行,请测试特殊参数“-”的值。当 shell 为交互方式时,它包含 i。例如:
因此我们可以使用 case..in..esac (bash case 语句)
case "$-" in *i*) echo This shell is interactive ;; *) echo This shell is not interactive ;; esac
或者我们可以使用 if 命令:
if [[ $- == *i* ]] then echo "I will do interactive stuff here." else echo "I will do non-interactive stuff here or simply exit with an error." fi
使用 tty 命令检查 bash 中 shell 是否在交互模式下运行
您也可以使用tty 命令,如下所示:
tty -s && echo "This shell is interactive" || echo "This shell is not interactive" ##OR ## ssh user@server1.example.com tty -s && echo "This shell is interactive" || echo "This shell is not interactive"
使用测试命令
根据注释,我们也可以使用测试命令:
-t FD file descriptor FD is opened on a terminal
因此,我们可以使用以下代码片段:
if [ -t 0 ] ; then echo "Doing interactive stuff here in my bash script ..." else echo "Error ..." fi
结论
您了解了如何使用各种命令行选项在 GNU/bash 中检查 shell 是否以交互模式运行。通过键入以下 bash 命令或访问此 URL来查看 GNU/bash 手册页:
man bash