如何检测 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一个失败 由于缺少适当的参数而退出代码(即漏报)。
我在家里和工作中使用了几种不同的 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一个失败 由于缺少适当的参数而退出代码(即漏报)。