如何检测 OS 并有条件地加载 ZSH 设置?

How to detect OS and load ZSH settings conditionally?

我在家里和工作中使用了几种不同的 OS,我希望能够有条件地加载平台特定的 ZSH 设置,这取决于我在给定的 OS 使用的是哪个 OS时刻.

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

# 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 时不起作用,它没有显示所有需要的文件来源。

提前致谢!

正在验证 OS 是否依赖于系统。您可以使用包管理器来验证某个发行版,但这不是我们想要的,因为肯定还有其他发行版也使用相同的包管理器。

您可以尝试使用lsb_release and grep on the correct distribution. Or use uname

哪些 OS 没有加载到您的脚本中,哪些可以加载?

另外,看看here

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

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

在我看来,只有 OS 特定的测试需要相互排斥,所以您可能正在寻找类似的东西:

# 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 中找到 <cmd_name>,则 return 成功。 command <cmd_name>其实是运行s<cmd_name>和returns它的退出状态,可以return一个失败 由于缺少适当的参数而退出代码(即漏报)。