【问题标题】:How to detect OS and load ZSH settings conditionally?如何检测操作系统并有条件地加载 ZSH 设置?
【发布时间】:2019-07-03 13:48:04
【问题描述】:

我在家和工作中使用几种不同的操作系统,我希望能够有条件地加载特定于 platorm 的 ZSH 设置,具体取决于我在给定时刻使用的操作系统。

我试过了,但它没有加载我期望的所有内容:

# Condtitional loading of zsh settings per platform

if command apt > /dev/null; then
    source $ZSH_CUSTOM/os/debian.zsh

elif command systemctl > /dev/null; then
    source $ZSH_CUSTOM/os/systemd.zsh

elif command freebsd-version > /dev/null; then
    source $ZSH_CUSTOM/os/freebsd.zsh

elif [[ `uname` == "Darwin" ]]; then
    source $ZSH_CUSTOM/os/mac.zsh

elif command kubectl > /dev/null; then
    source $ZSH_CUSTOM/os/kubernetes.zsh

else
    echo 'Unknown OS!'
fi

进行此检测的最佳方法是什么?我做错了什么? 我知道我的这种方法不起作用,因为当我运行 zsh -o SOURCE_TRACE 时,它不会显示所有所需的文件来源。

提前致谢!

【问题讨论】:

  • 大概/etc对于每个操作系统都是唯一的;只需向/etc/zshenv 添加一个标识当前操作系统的环境变量,然后在您的配置中检查该变量。
  • @chepner 您要针对 /etc 的哪一部分?
  • /etc/zshenv/etc 中的很多内容是特定于操作系统的(或至少是特定于发行版的),所以我假设您不会在操作系统安装之间共享同一个目录。

标签: linux bash shell zsh oh-my-zsh


【解决方案1】:

我在 Reddit here 上回答了完全相同的问题,所以为了结束循环,这是我写的:

您当前的逻辑字面意思是,例如,Debian 系统不可能运行 systemd 或 Kubernetes,这显然是不正确的。这正是if...elif...else...fi 所实现的:互斥性

在我看来,只有特定于操作系统的测试需要互斥,所以您可能正在查看类似的内容:

# What OS are we running?
if command apt > /dev/null; then
    source $ZSH_CUSTOM/os/debian.zsh

elif command freebsd-version > /dev/null; then
    source $ZSH_CUSTOM/os/freebsd.zsh

elif [[ `uname` == "Darwin" ]]; then
    source $ZSH_CUSTOM/os/mac.zsh

else
    echo 'Unknown OS!'
fi

# Do we have systemd on board?
if command systemctl > /dev/null; then
    source $ZSH_CUSTOM/os/systemd.zsh
fi

# Ditto Kubernetes?
if command kubectl > /dev/null; then
    source $ZSH_CUSTOM/os/kubernetes.zsh
fi

更新:实际上,我没有仔细查看您的代码,而且您还错误地调用了command。您的所有调用都应采用以下形式:

if command -v <cmd_name> > /dev/null

如果在您的PATH 中找到&lt;cmd_name&gt;,则返回成功。 command &lt;cmd_name&gt; 实际上运行 &lt;cmd_name&gt; 并返回其退出状态,由于缺少适当的参数,它可以返回一个失败退出代码(即假否定)。

【讨论】:

    【解决方案2】:

    验证操作系统取决于系统。您可以使用包管理器来验证某个发行版,但这不是我们所希望的,因为当然还有其他发行版也使用相同的包管理器。

    您可以尝试在正确的发行版上使用lsb_release 和 grep。或者使用uname

    哪些操作系统不会加载到您的脚本中,哪些会加载?

    另外,看看here

    【讨论】:

    • 尝试在脚本中使用带有一些标志的 lsb_release 或 uname 来验证分发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2012-04-01
    相关资源
    最近更新 更多