用于使用apt-get和yum进行安装的通用bash脚本

时间:2014-01-29 02:51:49

标签: linux bash yum apt-get

我正在尝试编写一个简单的bash包装器,它提取yumapt-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

是否可以进行任何错误或改进/优化?

5 个答案:

答案 0 :(得分:4)

看看how pacapt detects the OS

# 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,而不是自己滚动?

答案 1 :(得分:1)

如果您要这样做,为什么要求用户告诉脚本使用哪个工具?

#!/bin/bash
# Find our package manager
if VERB="$( which apt-get )" 2> /dev/null; then
   echo "Debian-based"
elif VERB="$( which yum )" 2> /dev/null; then
   echo "Modern Red Hat-based"
elif VERB="$( which portage )" 2> /dev/null; then
   echo "Gentoo-based"
elif VERB="$( which pacman )" 2> /dev/null; then
   echo "Arch-based"
else
   echo "I have no idea what I'm doing." >&2
   exit 1
fi
if [[ 1 -ne $# ]]; then
   echo "Syntax: $0 PACKAGE"
   exit 1
fi
$VERB "$1"
exit $?

稍微好一点,看看/etc/issue,看看你的发行版是什么,并做出相应的行为。

答案 2 :(得分:1)

我正在寻找一个单行程序来安装一个程序包,但是找不到任何内容,所以这是我的最终版本:

if [ "" == "`which unzip`" ]; then echo "Unzip Not Found"; if [ -n "`which apt-get`" ]; then apt-get -y install unzip ; elif [ -n "`which yum`" ]; then yum -y install unzip ; fi ; fi
  

它特定于unzip包,但可以更改为apt-get / yum上可用的任何其他包。

希望这会有所帮助:)

答案 3 :(得分:0)

命令lsb_release可以帮助您。

答案 4 :(得分:0)

    #!/bin/bash
    # file: src/bash/aspark-starter/install-prerequisites-for-aspark-starter.sh
    # caveat package names are for Ubuntu !!!
    set -eu -o pipefail # fail on error , debug all lines

    # run as root
    [ "${USER:-}" = "root" ] || exec sudo "$0" "$@"

    echo "=== $BASH_SOURCE on $(hostname -f) at $(date)" >&2


    echo installing the must-have pre-requisites
    while read -r p ; do
        if [ "" == "`which $p`" ];
        then echo "$p Not Found";
            if [ -n "`which apt-get`" ];
            then apt-get install -y $p ;
            elif [ -n "`which yum`" ];
            then yum -y install $p ;
            fi ;
        fi
    done < <(cat << "EOF"
        perl
        zip unzip
        exuberant-ctags
        mutt
        libxml-atom-perl
        postgresql-9.6
        libdbd-pgsql
        curl
        wget
        libwww-curl-perl
    EOF
    )

    echo installing the nice-to-have pre-requisites
    echo you have 5 seconds to proceed ...
    echo or
    echo hit Ctrl+C to quit
    echo -e "\n"
    sleep 6

    echo installing the nice to-have pre-requisites
    while read -r p ; do
        if [ "" == "`which $p`" ];
        then echo "$p Not Found";
            if [ -n "`which apt-get`" ];
            then apt-get install -y $p ;
            elif [ -n "`which yum`" ];
            then yum -y install $p ;
            fi ;
        fi
    done < <(cat << "EOF"
        tig
    EOF
    )