如何有条件地检测操作系统并加载ZSH设置?

问题描述 投票:0回答:2

我在家和工作中使用了几种不同的操作系统,我希望能够有条件地加载特定于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时,它没有显示所有需要的文件来源。

提前致谢!

linux bash shell zsh oh-my-zsh
2个回答
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

0
投票

验证操作系统取决于系统。您可以使用包管理器来验证某个分发,但这不是必需的,因为肯定有其他发行版也是同一个包管理器。

您可以尝试在正确的分布上使用lsb_release和grep。或者使用uname

您的脚本中没有加载哪些操作系统,哪些操作系统可以加载?

另外,看看here

© www.soinside.com 2019 - 2024. All rights reserved.