如何检查 shell 是否登录/交互式/批处理

如何检查 shell 是否登录/交互式/批处理

我想我理解交互式 shell、登录 shell 和批处理 shell 之间的区别。请参阅以下链接获取更多帮助:

我的问题是,如果我使用交互式、登录或批处理 shell,如何使用命令/条件进行测试?

我正在寻找一个命令或条件(返回trueor 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

相关内容