اسکریپتی برای کار با pacman

امین 18 ژوئن 2024 زمان خواندن: 8 دقیقه

مدتها بود که یک اسکریپت دم دستی رو برای راحت تر کردن فانکشنهای پکمن استفاده می‌کردم. که البته ایرادهای فنی و اسکریپتی زیادی داشت. سر انجام با راهنمایی های چند تا دوست خوب توی گروه های آرچ، دستی به سر و روی اسکریپت کشیدم. 

هدف این اسکریپت اینه که یک سری عملکردهای رایج و به درد بخور پکمن رو که بعضا دستورات بلندی میشن و نمیشه به یاد سپرد، به دستورات کوتاه تبدیل کنیم.

Screenshot from 2024-06-18 12-13-14.png 

ویژگی ها و کارهایی که این اسکریپت میکنه:

  • استفاده از یک AUR Helper به دلخواه خودتون (پیشفرض: yay)
  • استفاده از sudo یا doas به دلخواه خودتون (پیشفرض: sudo)
  • جست و جوی پکیج ها در مخازن رسمی و AUR
  • نصب پکیج (ها) چه از مخازن چه از فایل، با یک دستور ثابت
  • پیدا کردن بسته ای که صاحب یک فایل خاصی است
  • نمایش اطلاعات یک بسته
  • حذف بسته ها با/بدون حذف بسته های وابسته
  • حذف بسته های orphan
  • آپدیت کل سیستم با کمک AUR Helper 
  • یافتن سریعترین میرورها (با reflector)
  • نمایش دپندنسی های یک بسته
  • نمایش بسته هایی که به یک بسته وابسته هستند.
  • نمایش محتوای یک فایل درون فایل فشرده یک بسته tar
  • نمایش لیستی از بسته ها با این ویژگیها:
    • تمامی پکیج ها (نصب شده یا نشده)
    • بسته های نصب شده
    • بسته های orphan
    • بسته هایی که خارج از پکیج منیجر نصب کردیم
    • بسته هایی که هیچ بسته دیگه ای به اونها وابستگی نداره
    • بسته هایی که قابل بروزرسانی هستن
    • قابلیت جست و جوی بسته ها درون این لیست ها
  • ذخیره یک فایل در پوشه کاربر حاوی لیست تمامی پکیج های نصب شده
  • پاک‌سازی کش پکمن
  • آنلاک کردن دیتبایس با حذف فایل db.lck

برای استفاده از این اسکریپت، میبایست یک سری ابزار رو نصب کنید:

$ sudo pacman -S pacman-contrib reflector fzf pkgfile

اسکریپت زیر رو در یک جایی مثلا در /usr/local/bin قرار بدید یا براش alias بسازید، و مجوز اجرایی رو هم بهش بدید. در متن اسکریپت نگاه کنید و متغیر HELPER=yay رو به چیزی که خودتون دارید تغییر بدید. همین طور اگر از doas به جای sudo استفاده میکنید، در متغیر SUSR=sudo اون رو هم تغییر بدید.

روش کار هم ساده است. مثلا برای نمایش لیستی از پکیج هایی که نصب داریم، میتونیم بنویسیم:

$ pm -bi

اگر شما هم فانکشن به درد بخوری رو سراغ دارید که میتونیم اضافه کنیم، کامنت کنید.

متن اسکریپت:

#!/bin/sh
#
# pm is a simple script to make working with pacman easier
# Author: Amin medicamin@gmail.com http://linuxvaman.ir 
# Based on https://github.com/IndrekHaav/pac
#

set -eu

RESET="\033[0m"
RED="\033[1;31m"
BOLD="\033[1m"

#Change if you have another AUR helper
#Or replace yay with pacman if you don't use AUR at all.
HELPER=yay

#You may use another super user helper, such as doas
SUSR=sudo

#You can define search options based on your needs
#Change if you use helpers other than yay, or leave it blank
HELPERSEARCH=--topdown

__usage() {

    cat <<EOF
Usage: $(basename "$0") command
$(echo -e "${BOLD}Requirements:${RESET}") pacman-contrib reflector fzf pkgfile yay (or other AUR helpers)

$(echo -e "${BOLD}Working with Packages${RESET}")
    -s,  search <string>	Search for packages matching <string>
    -f,  find <file>		Find the package owner of the file (path or name) 
    -sh, show <packages>	Returns information about <packages>
    -i,  install <packages>	Install <packages>
    -r,  remove <packages>	Remove <packages>
    -rd, removedep <packages>	Remove <packages> and all their dependencies
    -ro, removeorphan		Remove all orphan packages and their dependencies
    -u,  update			Perform a full system upgrade
    -m,  mirrors		Generate mirrorlist sorted by 10 fastest servers
    -d,  depends <package>	Shows a list of dependencies for <package>
    -do, dependson <package>	Shows a list of packages that depend on <package>
    -v,  view			Display content of a file inside a tar package
    
$(echo -e "${BOLD}Browse packages${RESET}")
    -bd, database	  	Browse all available packages
    -bi, installed	  	Browse all installed packages
    -bf, foreign	  	Browse all manually installed packages
    -bn, nodeps	  		Browse packages with no dependency
    -bo, orphans	  	Browse orphan packages
    -bu, updatable	  	Browse upgradable packages
    -l,  list			Create a list of installed packages in the home directory
    
$(echo -e "${BOLD}Pacman Database${RESET}")
    -c,  clean			Clear pacman cache, keeps only latest package
    -p,  purge			Clear pacman cache, keeps nothing   
    -db, unlock			Unlock database by removing /var/lib/pacman/db.lck
    
EOF
    exit
}

__error() {
    printf "${RED}error:${RESET} %s\n" "$1"
}

__fatal() {
    __error "$1"
    exit 1
}

[ "$#" -gt 0 ] || __usage

case "$1" in

    -s|search) #Search for packages matching <string>
        shift
        command -v $HELPER > /dev/null || __fatal "change HELPER in the source or install yay"
        [ "$#" -eq 1 ] || __fatal "enter a search term"
        $HELPER -Ss "$@" $HELPERSEARCH
        ;;
        
    -f|find) #Find the package owner of the file (path or name) 
        shift
        command -v pkgfile > /dev/null || __fatal "install pkgfile to use this functionality"
        [ "$#" -gt 0 ] || __fatal "enter something"
        pkgfile "$@"
        ;;
        
    -sh|show) #Returns information about <packages>
        shift
        [ "$#" -gt 0 ] || __fatal "enter a package name"
        for package in "$@"; do
            pacman -Qi "$package" 2>/dev/null || pacman -Si "$package" 2>/dev/null || __error "package '$package' was not found"
        done
        ;;
        
    -i|install) #Install <packages>
        shift
        [ "$#" -gt 0 ] || __fatal "enter a package name"
        if [ -f "$*" ]; then pacman -U "$*"; else $HELPER -S "$@"; fi
        ;;
        
    -r|remove) #Remove <packages>
        shift
        [ "$#" -gt 0 ] || __fatal "enter a package name"
        $SUSR pacman -R "$@"
        ;;
        
    -rd|removedep) #Remove <packages> and all their dependencies
        shift
        pkgs=${*:-$(pacman -Qdtq)}
        # shellcheck disable=SC2086
        [ -n "$pkgs" ] && $SUSR pacman -Rns $pkgs
        ;;
        
    -ro|removeorphan) #Remove all orphan packages and their dependencies
        pacman -Qdtq | $SUSR pacman -Rns -
        ;;
             
    -u|update) #Perform a full system upgrade
        $HELPER -Syu
        ;;
        
    -m|mirrors) #Generate mirrorlist sorted by 10 fastest servers
        shift
        command -v reflector > /dev/null || __fatal "install reflector to use this functionality"
        $SUSR reflector --age 6 --fastest 10 --latest 10 --sort rate --protocol https --save /etc/pacman.d/mirrorlist
        ;;
        
    -d|depends) #Shows a list of dependencies for <package>
        shift
        command -v pactree > /dev/null || __fatal "install pacman-contrib to use this functionality"
        [ "$#" -gt 0 ] || __fatal "enter a package name"
        pactree -s -d1 -o1 "$@"
        ;;
        
    -do|dependson) #Shows a list of packages that depend on <package>
        shift
        command -v pactree > /dev/null || __fatal "install pacman-contrib to use this functionality"
        [ "$#" -gt 0 ] || __fatal "enter a package name"
        pactree -r -s -d1 -o1 "$@"
        ;;

    -v|view) #Display content of a file inside a tar package
    	shift
    	[ "$#" -gt 1 ] || __fatal "example: pm -v /path/to/package.pkg.tar.zst etc/file.conf "
        bsdtar -xOf $2 $3
        ;;
        
     -bd|database) #Browse all available packages
        shift
        command -v pactree > /dev/null || __fatal "install fzf to use this functionality"
        pacman -Slq | fzf -e --padding=4%,0,0,0 --margin=4%,0,0,0 --no-scrollbar --info=inline-right  --border=top --border-label='╢ Browse all available packages ╟' --border-label-pos=3 --preview 'pacman -Si {}' --layout=reverse-list 
        ;;
        
     -bi|installed) #Browse all installed packages
        shift
        command -v pactree > /dev/null || __fatal "install fzf to use this functionality"
        pacman -Qq | fzf -e --padding=4%,0,0,0 --margin=4%,0,0,0 --no-scrollbar --info=inline-right  --border=top --border-label='╢ Browse all installed packages ╟' --border-label-pos=3 --preview 'pacman -Qil {}' --layout=reverse-list --bind 'enter:execute(pacman -Qil {} | less)' 
        ;;
         
     -bf|foreign) #Browse all manually installed packages
        shift
        command -v pactree > /dev/null || __fatal "install fzf to use this functionality"
        pacman -Qqm | fzf -e --padding=4%,0,0,0 --margin=4%,0,0,0 --no-scrollbar --info=inline-right  --border=top --border-label='╢ Browse all manually installed packages ╟' --border-label-pos=3 --preview 'pacman -Qil {}' --layout=reverse-list --bind 'enter:execute(pacman -Qil {} | less)' 
        ;;
        
     -bn|nodeps) #Browse packages with no dependency
        shift
        command -v pactree > /dev/null || __fatal "install fzf to use this functionality"
        pacman -Qqent | fzf -e --padding=4%,0,0,0 --margin=4%,0,0,0 --no-scrollbar --info=inline-right  --border=top --border-label='╢ Browse installed packages without dependency ╟' --border-label-pos=3 --preview 'pacman -Qil {}' --layout=reverse-list --bind 'enter:execute(pacman -Qil {} | less)' 
        ;;
        
     -bo|orphans) #Browse orphan packages
        shift
        command -v pactree > /dev/null || __fatal "install fzf to use this functionality"
        pacman -Qdtq | fzf -e --padding=4%,0,0,0 --margin=4%,0,0,0 --no-scrollbar --info=inline-right  --border=top --border-label='╢ Browse orphan packages ╟' --border-label-pos=3 --preview 'pacman -Qil {}' --layout=reverse-list --bind 'enter:execute(pacman -Qil {} | less)' 
        ;;
        
     -bu|updatable) #Browse upgradable packages
        shift
        command -v pactree > /dev/null || __fatal "install fzf to use this functionality"
        pacman -Qu | fzf -e --padding=4%,0,0,0 --margin=4%,0,0,0 --no-scrollbar --info=inline-right  --border=top --border-label='╢ Browse upgradable packages ╟' --border-label-pos=3 --layout=reverse-list --preview-window=hidden
        ;;

    -l|list) #Create a list of installed packages in the home directory
    	pacman -Qq >~/pkglist_all.txt;
	echo "packages list sorted by name: $HOME/pkglist_all.txt"
        ;;
      
    -c|clean) #Clear pacman cache, keeps only latest package
    	command -v paccache > /dev/null || __fatal "install pacman-contrib to use this functionality"
        $SUSR paccache -rk1
        ;;  
        
    -p|purge) #Clear pacman cache, keeps nothing
        $SUSR pacman -Sc
        ;;

    -db|unlock) #Unlocks database by removing /var/lib/pacman/db.lck 
        $SUSR rm /var/lib/pacman/db.lck
        ;;
        
    *)
        __usage
        ;;
esac

محمد
نوشته محمد در مورخه 7 جوملای 2024

سلام، وبلاگتون rss نداره؟

امین Admin
نوشته امین در مورخه 12 جوملای 2024

ممنون از پیشنهاد شما. rss در این لینک فعال شد: https://linuxvaman.ir/rss.xml




حاصل سر و کله زدن های من با لینوکس