【问题标题】:In which operating system does my terminal run?我的终端在哪个操作系统中运行?
【发布时间】:2015-01-12 19:40:09
【问题描述】:

我想将命令绑定到 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 在哪个操作系统中运行,而是我的 终端 在哪个操作系统中运行。有没有办法获取该信息?

请不要关注绑定中使用的键的细节。在这一点上这无关紧要:)

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

  • 终端就是那个东西,你输入你的命令,比如Iterm2Guake或者Xterm
  • shell 是一个东西,它接收并执行命令,如BashZshFish

【问题讨论】:

    标签: linux macos shell terminal zsh


    【解决方案1】:

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

    它还会告诉您是在 32 位还是 64 位 MacOS 机器上。

    【讨论】:

    • arch 仅显示有关运行 shell 的系统的信息。此外,它仅在 OSX 上可用(如果可以从 linux 系统调用 - 但它不能)。
    • 哦,那我在 AUR 搜索结果中没有看到正确的包。至少它在我的 ArchLinux 机器上默认不可用。
    • 呃……事实上 Arch 是 Linux 风格的名称,这使得用谷歌搜索开源代码来编译 arch 命令真的很困难。
    【解决方案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):

      SendEnv CLIENT_OSTYPE
      

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

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

      AcceptEnv CLIENT_OSTYPE
      

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

      AcceptEnv LANG LC_* CLIENT_OSTYPE
      

    然后您可以使用CLIENT_OSTYPE 的值来决定要使用的配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2011-10-07
      相关资源
      最近更新 更多