我想我理解交互式 shell、登录 shell 和批处理 shell 之间的区别。请参阅以下链接获取更多帮助:
- “登录”和“交互式”bash shell 有什么区别(来自姐妹网站:服务器故障)
- 登录 Shell 和非登录 Shell 之间的区别?
- 2.1: shell 类型:交互式 shell 和登录 shell(从Z-Shell 用户指南)
我的问题是,如果我使用交互式、登录或批处理 shell,如何使用命令/条件进行测试?
我正在寻找一个命令或条件(返回true
or false
)并且我也可以将其放入if
语句中。例如:
if [[ condition ]]
echo "This is a login shell"
fi
答案1
我假设有一个bash
外壳或类似的外壳,因为标签中没有列出外壳。
要检查您是否处于交互式 shell 中:
[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'
要检查您是否处于登录 shell 中:
shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'
通过“批处理”,我假设您的意思是“非交互式”,因此对交互式 shell 的检查应该足够了。
答案2
在任何 Bourne 风格的 shell 中,该i
选项指示 shell 是否是交互式的:
case $- in
*i*) echo "This shell is interactive";;
*) echo "This is a script";;
esac
没有可移植且完全可靠的方法来测试登录 shell。 Ksh 和 zsh 添加l
到$-
. Bash 设置该login_shell
选项,您可以使用 查询该选项shopt -q login_shell
。可移植的是,测试是否$0
以-
: 开头,shell 通常知道它们是登录 shell,因为调用者-
向参数零添加了前缀(通常是可执行文件的名称或路径)。这无法检测调用登录 shell 的特定于 shell 的方式(例如ash -l
)。
答案3
鱼壳
fish
这是以防其他用户偶然发现此页面的答案。
if status --is-interactive
# fish is interactive - that is, connected to a keyboard.
# do stuff...
end
if status --is-login
# fish is a login shell - that is, should perform login tasks such as setting up PATH
# do stuff...
end
echo "darn, I really wanted to have to use globs or at least a case statement"
鱼文档参考
答案4
另一种方法是检查结果tty
if [ "`tty`" != "not a tty" ]; then