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

时间:2019-02-09 14:45:01

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

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

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

哪些OS不会加载到脚本中,哪些会加载?

另外,看看here