我将如何检测非登录 shell?(在 Zsh 中)

Gee*_*eeb 9 zsh configuration shell-script interactive ssh-agent

我想创建一个在 Zsh 实例启动时运行的脚本,但前提是该实例是:

  • 非登录。
  • 交互的

我觉得我说得对.zshrc运行的所有交互shell实例,.zprofile.zlogin为所有登录shell运行,并且.zshenv运行于所有情况。

我想这样做的原因是检查是否有现有的 ssh-agent 正在运行,如果有,请在新打开的 shell 中使用它。

我想任何执行的测试都最好放在.zshrc(因为这保证了交互式 shell)和从那里调用的指定“非登录事件”脚本中。

在测试 ssh-agent 之前,我可能首先想检查新 shell 是否已经作为现有远程 SSH 会话的一部分运行,但我为此找到了这个 SE 配方

我选择 Zsh 是因为它是我喜欢的 shell,但我想任何正确的技术都适用于其他 shell。

Sté*_*las 16

if [[ -o login ]]; then
  echo "I'm a login shell"
fi

if [[ -o interactive ]]; then
  echo "I'm interactive"
fi
Run Code Online (Sandbox Code Playgroud)

[[ -o the-option ]] 如果设置了选项,则返回 true。

您还可以使用$options特殊关联数组或通过运行set -o.

要检查是否有 ssh-agent:

if [[ -w $SSH_AUTH_SOCK ]]; then
  echo "there's one"
fi
Run Code Online (Sandbox Code Playgroud)

ksh(和zsh):

case $- in (*i*) echo interactive; esac
case $- in (*l*) echo login; esac
Run Code Online (Sandbox Code Playgroud)

bash,这是一团糟,你需要:

case $- in *i*) echo interactive; esac # that should work in any Bourne/POSIX shell
case :$BASHOPTS: in (*:login_shell:*) echo login; esac
Run Code Online (Sandbox Code Playgroud)

$SHELLOPTS包含更多选项。您可以设置一些选项set -<x>,有的用set -o option,有的用shopt -s option