dzh*_*zhi 11 linux bash shell zsh oh-my-zsh
我在家里和工作中使用多种不同的操作系统,并且我希望能够有条件地加载特定于平台的 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
Run Code Online (Sandbox Code Playgroud)
进行此检测的最佳方法是什么以及我做错了什么?我知道我的这种方法不起作用,因为当我运行时zsh -o SOURCE_TRACE
,它不会显示所有所需的文件来源。
提前致谢!
Adr*_*ian 11
感谢@Cyber beni提醒我,在apt
macOS 上会错误地匹配系统 Java 运行时的注释处理工具。汇总必要的更改,我们现在拥有:
# 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
Run Code Online (Sandbox Code Playgroud)
我在 Reddit上回答了完全相同的问题,所以为了结束循环,我写了以下内容:
您当前的逻辑字面意思是,例如,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
Run Code Online (Sandbox Code Playgroud)
更新:实际上,我没有仔细研究你的代码,而且你也调用了command
错误。您的所有调用都应采用以下形式:
if command -v <cmd_name> > /dev/null
Run Code Online (Sandbox Code Playgroud)
如果<cmd_name>
在您的PATH
. command <cmd_name>
实际上运行 <cmd_name>
并返回其退出状态,由于缺少适当的参数,可能会返回失败退出代码(即假阴性)。