linux - 我的终端在哪个操作系统中运行?

标签 linux macos shell terminal zsh

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

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

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

  • 终端就是那个东西,你输入你的命令,比如Iterm2 , GuakeXterm
  • shell 是个东西,它接收并执行像Bash 这样的命令。 , ZshFish

最佳答案

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)或全局(最有可能是 /etc/ssh/ssh_config 在 Linux 上,/etc/ssh_config 在 Mac 上):

    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 的值来决定要使用的配置。

关于linux - 我的终端在哪个操作系统中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26946510/

相关文章:

linux - 为什么这段代码可以在 Linux 上运行,但不能在 SunOS 上运行?

shell - MinGW/MSYS shell 颜色

string - 如何用 bash 中的另一个字符替换字符串的最后一个字符?

bash - 打开多个终端并执行不同命令的 Shell 脚本

linux - `aide` 宏定义中的正则表达式错误

python - 运行 matplotlib 与 nbagg 交互的 linux VM 上的 ipython 笔记本

objective-c - 如何修改我的 Cocoa 应用程序中自动生成的关于窗口?

SQLite 上的 Java JDBC

c - 如何检查消息是否传递到任何单个队列

OS X EL Capitan 上的 MySQL 5.7.13 Homebrew : ERROR! 服务器在启动时退出而不更新 PID 文件