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

hwamh0ep  于 2023-02-09  发布在  Shell
关注(0)|答案(2)|浏览(120)

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

balp4ylt

balp4ylt1#

修订答案(2020年2月9日)

感谢@Cyberbeni提醒我,macOS上的apt可能会错误地匹配系统Java运行时的AnnotationPprocessingTool。总结必要的更改,我们现在有:

# What OS are we running?
if [[ $(uname) == "Darwin" ]]; then
    source "$ZSH_CUSTOM"/os/mac.zsh

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

elif command -v apt > /dev/null; then
    source "$ZSH_CUSTOM"/os/debian.zsh

else
    echo 'Unknown OS!'
fi

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

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

原始答案

我在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

UPDATE:实际上,我没有仔细查看您的代码,您也错误地调用了command。您所有的调用都应该是以下形式:

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

如果在PATH中找到<cmd_name>,则返回success。command <cmd_name>实际上运行<cmd_name>并返回其退出状态,由于缺少适当的参数,该退出状态可能返回 * failure * 退出代码(即,假否定)。

dsekswqp

dsekswqp2#

验证一个操作系统是依赖于系统的。你可以使用软件包管理器来验证某个发行版,但这并不可取,因为肯定有其他发行版也使用相同的软件包管理器。
您可以尝试在正确的发行版上使用lsb_release和grep,或者使用uname
哪些操作系统没有加载到您的脚本中,哪些加载了?
另外,请看一下here

相关问题