像使用 apt、dnf 那样使用 pacman —— 给 pacman 增加子命令样式的参数

像使用 apt、dnf 那样使用 pacman —— 给 pacman 增加子命令样式的参数

用过 Arch 的都知道其包管理器 pacman 以及很多“AUR helper”如 yay、paru 等,使用的 -S 形式的“选项”(OPTIONS)作为参数。这和主流的 apt、dnf/yum 等的子命令式参数有着明显差异,很多新接触的都是一脸懵逼,比如最经典的 -S-Sy-Syy-Syu-Syyu-Syuu 这一连串看着类似的选项。

很多人就算用 Arch 挺长时间也根本不知道什么意思,就是入门时看的什么“小白教材”这么写就这么一直用了。

其实 apt 和 dnf/yum 的“底层” dpkg、rpm 也是选项式的,而他们作为直接与用户交互的封装都使用了子命令式,说明子命令应该对大部分人来说是更易使用的,因为它更“human-readable”。所以简单写了个脚本,让用户也可以以 apt 那样的子命令使用 pacman 或 yay。

#!/usr/bin/sh

# Shortcuts for pacman/yay/paru
if command -v "yay" >/dev/null; then
    PKG="yay"
elif command -v "paru" >/dev/null; then
    PKG="paru"
else
    PKG="pacman"
fi

if [ "$USER" != "root" ] && [ "$PKG" = "pacman" ]; then
    NEED_SUDO="sudo "
else
    NEED_SUDO=""
fi

if [ $# -eq 0 ]; then
    echo -e "The user is $USER"
    echo -e "The package manager is $PKG\n"
    $PKG
    exit 0
fi

sub_cmd=$1
shift

case $sub_cmd in
    "search")
        $PKG -Ss $@
    ;;
    "show")
        # from repo
        $PKG -Si $@
    ;;
    "info")
        # from local
        $PKG -Qi $@
    ;;
    "update")
        echo 'Avoid doing partial upgrades.'
        echo 'In other words, never run update(-Sy); instead, always use upgrade(-Syu).'
        echo 'Refer to https://wiki.archlinux.org/title/System_maintenance 3.2 3.3'
        echo '请避免部分更新,不要运行 update(-Sy),而是运行 upgrade(-Syu)。'
        echo '请参阅 https://wiki.archlinuxcn.org/wiki/系统维护 3.2 3.3'
    ;;
    "install")
        param="$1"
        shift
        case "$param" in
            ./*)
                # install local package
                $NEED_SUDO$PKG -U $param $@
            ;;
            *)
                $NEED_SUDO$PKG -S $param $@
            ;;
        esac
    ;;
    "upgrade")
        $NEED_SUDO$PKG -Syu $@
    ;;
    "force-upgrade")
        $NEED_SUDO$PKG -Syyu $@
    ;;
    "remove")
        echo suggest to use "purge" or "autopurge"
        $NEED_SUDO$PKG -R $@
    ;;
    "purge")
        $NEED_SUDO$PKG -Rn $@
    ;;
    "autoremove" | "autopurge")
        if [ $# -eq 0 ] ; then
            # from https://wiki.archlinuxcn.org/wiki/Pacman/提示和技巧 1.6
            $PKG -Qtdq | $NEED_SUDO$PKG -Rns -
        elif [ $sub_cmd = "autoremove" ]; then
            $NEED_SUDO$PKG -Rcs $@
        elif [ $sub_cmd = "autopurge" ]; then
            $NEED_SUDO$PKG -Rncs $@
        fi
    ;;
    "clean")
        $NEED_SUDO$PKG -Sc $@
    ;;
    *)
        $PKG $sub_cmd $@
    ;;
esac