我正在尝试编写一个简单的bash包装器,将其摘要yum
和apt-get
。基本上,所以我们可以做类似universal-install curl
以下的事情:
# universal-install package=$1 apt=`command -v apt-get` yum=`command -v yum` if [ -n "$apt" ]; then apt-get update apt-get -y install $package elif [ -n "$yum" ]; then yum -y install $package else echo "Err: no path to apt-get or yum" >&2; exit 1; fi
是否可以进行任何错误或改进/优化?
看一下pacapt如何检测操作系统:
# Detect package type from /etc/issue _found_arch() { local _ostype="$1" shift grep -qis "$*" /etc/issue && _OSTYPE="$_ostype" } # Detect package type _OSTYPE_detect() { _found_arch PACMAN "Arch Linux" && return _found_arch DPKG "Debian GNU/Linux" && return _found_arch DPKG "Ubuntu" && return _found_arch YUM "CentOS" && return _found_arch YUM "Red Hat" && return _found_arch YUM "Fedora" && return _found_arch ZYPPER "SUSE" && return [[ -z "$_OSTYPE" ]] || return # See also https://github.com/icy/pacapt/pull/22 # Please not that $OSTYPE (which is `linux-gnu` on Linux system) # is not our $_OSTYPE. The choice is not very good because # a typo can just break the logic of the program. if [[ "$OSTYPE" != "darwin"* ]]; then _error "Can't detect OS type from /etc/issue. Running fallback method." fi [[ -x "/usr/bin/pacman" ]] && _OSTYPE="PACMAN" && return [[ -x "/usr/bin/apt-get" ]] && _OSTYPE="DPKG" && return [[ -x "/usr/bin/yum" ]] && _OSTYPE="YUM" && return [[ -x "/opt/local/bin/port" ]] && _OSTYPE="MACPORTS" && return command -v brew >/dev/null && _OSTYPE="HOMEBREW" && return [[ -x "/usr/bin/emerge" ]] && _OSTYPE="PORTAGE" && return [[ -x "/usr/bin/zypper" ]] && _OSTYPE="ZYPPER" && return if [[ -z "$_OSTYPE" ]]; then _error "No supported package manager installed on system" _error "(supported: apt, homebrew, pacman, portage, yum)" exit 1 fi }
如您所见,它首先检查/etc/issue
,然后让脚本为每个程序包管理器寻找关联的可执行文件。
但是,为什么不使用pacapt而不是自己动手?