我的终端在哪个操作系统上运行?

时间:2014-11-15 13:48:55

标签: linux macos shell terminal zsh

我想将命令绑定到zsh中的键组合,这在OSX和Linux上是不同的。我现在的状态是

if [[ "$(uname)" == "Darwin" ]]; then
  bindkey "^e" some-command # Ctrl+E for OSX
else
  bindkey "^[e" some-command # Alt+E for Linux
fi

但是,这不适用于这两个系统之间的ssh连接。实际上,我不想检查我的 shell 运行的操作系统,而是检查我的终端运行的操作系统。有没有办法获取该信息?

请不要关注绑定中使用的密钥的详细信息。在这一点上,这是不相关的:)

编辑: 为了让事情更清楚:

2 个答案:

答案 0 :(得分:2)

ssh可以将环境变量发送到服务器,默认情况下会对少数变量执行此操作。虽然客户端操作系统上的任何信息都不是该默认列表的一部分,但可以对其进行扩展。

  1. 您需要设置并导出具有所需信息的变量。你可以使用uname的输出,或者你可以复制OSTYPE(你不应该直接使用OSTYPE,因为改变它可能不是一个好主意)。因此,在两个系统的~/.zshrc中都需要这样的东西(当然,在你需要它之​​前的某个地方):

    export CLIENT_OSTYPE=${CLIENT_OSTYPE:-$OSTYPE}
    

    如果之前未设置,则会将CLIENT_OSTYPE设置为OSTYPE的值。因此,如果您在本地登录,则设置为OSTYPE。但是,如果您使用ssh登录,则会将其设置为传递的CLIENT_OSTYPE

  2. 现在您必须将SSH客户端设置为实际将CLIENT_OSTYPE传递给服务器。为此,您需要编辑SendEnv条目ssh客户端配置 - 用户特定(~/.ssh/config)或全局(Linux上最有可能/etc/ssh/ssh_config,Mac上为/etc/ssh_config):< / p>

    SendEnv CLIENT_OSTYPE
    

    它可能已在全局配置中设置为某个值(在我的情况下为LANG LC_*),在这种情况下只需添加到列表中:

    SendEnv LANG LC_* CLIENT_OSTYPE
    
  3. 最后,您必须配置SSH服务器以实际接受此环境变量。这可以通过修改/etc/ssh/sshd_config在Linux上/etc/sshd_config和Mac上AcceptEnv完成:

    AcceptEnv CLIENT_OSTYPE
    

    SendEnv类似,这也可能已设置为:

    AcceptEnv LANG LC_* CLIENT_OSTYPE
    
  4. 然后,您可以使用CLIENT_OSTYPE的值来决定要使用的配置。

答案 1 :(得分:-1)

我认为shell命令arch可能会帮助你。

它还会告诉您是使用32位还是64位MacOS计算机。