我在家里和工作中使用几种不同的操作系统,我希望能够有条件地加载特定于平台的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条答案
按热度按时间balp4ylt1#
修订答案(2020年2月9日)
感谢@Cyberbeni提醒我,macOS上的
apt
可能会错误地匹配系统Java运行时的AnnotationPprocessingTool。总结必要的更改,我们现在有:原始答案
我在Reddit here上回答了完全相同的问题,为了结束这个循环,我写了以下内容:
例如,你现在的逻辑是说Debian系统不可能运行systemd或Kubernetes,这显然是不正确的。这正是
if...elif...else...fi
所实现的:* 互斥性 *。在我看来,只有特定于操作系统的测试才需要互斥,因此您可能会看到如下内容:
UPDATE:实际上,我没有仔细查看您的代码,您也错误地调用了
command
。您所有的调用都应该是以下形式:如果在
PATH
中找到<cmd_name>
,则返回success。command <cmd_name>
实际上运行<cmd_name>
并返回其退出状态,由于缺少适当的参数,该退出状态可能返回 * failure * 退出代码(即,假否定)。dsekswqp2#
验证一个操作系统是依赖于系统的。你可以使用软件包管理器来验证某个发行版,但这并不可取,因为肯定有其他发行版也使用相同的软件包管理器。
您可以尝试在正确的发行版上使用lsb_release和grep,或者使用uname。
哪些操作系统没有加载到您的脚本中,哪些加载了?
另外,请看一下here