Arch 包管理工具 pacman 使用总结

发布于 2020-01-08

善用帮助文档

  • pacman -h 简要帮助信息
  • man pacman 详细帮助文档

查看相关文件

$ pacman -v
Root      : /
Conf File : /etc/pacman.conf
DB Path   : /var/lib/pacman/
Cache Dirs: /var/cache/pacman/pkg/
Hook Dirs : /usr/share/libalpm/hooks/  /etc/pacman.d/hooks/
Lock File : /var/lib/pacman/db.lck
Log File  : /var/log/pacman.log
GPG Dir   : /etc/pacman.d/gnupg/
Targets   : None

操作选项(operation)

pacman 在使用时通常是一个操作选项(大写字母)加上一些额外的参数(小写字母)。 相同的小写字母跟在不同的大写字母后面表示的含义可能不同。 那么多选项和组合只需要记住几个最常用的就可以, 其余的善用 Tab 补全 可以查看操作选项后可跟的额外参数和其简要作用描述。

$ pacman -h
usage:  pacman <operation> [...]
operations:
    pacman {-h --help}                             查看pacman使用帮助
    pacman {-V --version}                          查看pacman版本
    pacman {-D --database} <options> <package(s)>  操作软件包数据库
    pacman {-F --files}    [options] [package(s)]  查询文件数据库
    pacman {-Q --query}    [options] [package(s)]  查询已安装包信息
    pacman {-R --remove}   [options] <package(s)>  删除已安装包
    pacman {-S --sync}     [options] [package(s)]  同步(安装)包
    pacman {-T --deptest}  [options] [package(s)]  检查包依赖
    pacman {-U --upgrade}  [options] <file(s)>     更新或安装包

一些常用命令

  • 搜索
    • pacman -Ss curl 搜索指定软件
  • 安装
    • pacman -S curl 安装指定软件
    • pacman -U \/var/cache/pacman/pkg/curl-x.x.x-x86_64.pkg.tar.zst 安装(回滚)指定版本的软件
  • 更新
    • pacman -Syu 更新所有包
  • 查看
    • pacman -Q 查看所有已安装的包
    • pacman -Qe 查看所有被明确指定安装的包(而不是作为依赖项被安装)
    • pacman -Qd 查看所有仅作为依赖项而被安装的包
    • pacman -Qi 查看已安装包的详细信息
    • pacman -Ql 查看软件包中包含的文件列表
    • pacman -Qdt 查看孤立包(仅作为依赖被安装, 且当前没有被其他包依赖)
  • 删除
    • pacman -Rs curl 删除指定软件,并删除所有不被其他软件依赖的依赖包
    • pacman -Rsc curl 删除指定软件,并删除所有不被其他软件依赖的依赖包, 并删除所有依赖该软件的包
  • 清理
    • pacman -Sc 清理未安装软件包的缓存
    • pacman -Scc 清理所有软件包的缓存

一些复杂命令

  • 查看所有已安装的软件包及其描述, 每个软件包占一行

    pacman -Q | cut -d ' ' -f 1 | xargs pacman -Qi | awk '/^Name/ {printf $3 " "}; /^Description/ {print $0};' | sed 's/Description[[:space:]]*: / /'
    # 1.  pacman -Q  命令列出所有已安装的软件包及其版本号;
    # 2.  cut -d ' ' -f 1  命令将每行的第一个单词即软件包名称提取出来;
    # 3.  xargs pacman -Qi  命令对每个软件包名称执行  pacman -Qi  命令,获取软件包的详细信息;
    # 4.  awk '/^Name/ {printf $3 " "}; /^Description/ {print $0};'  命令对  pacman -Qi  命令的输出进行处理,将软件包名称和简要描述提取出来,并以空格分隔;
    # 5.  sed 's/Description[[:space:]]*: / /'  命令将简要描述中的 "Description: " 字符串替换为空格。
    
  • 接上, 如果还想让软件包名称和描述同时实现对齐

    pacman -Q | cut -d ' ' -f 1 | xargs pacman -Qi | awk '/^Name/ {printf "%-25s", $3}; /^Description/ {print $0};' | sed 's/Description[[:space:]]*: / /'
    # 不同之处在于在 awk 命令中使用了 printf "%-25s" 格式化输出,将软件包名称左对齐并占用 25 个字符的宽度
    
  • 再接上, 如果要动态计算软件包的名称, 而不是使用固定的宽度

    max_len=$(pacman -Q | awk '{if (length($1) > max) max=length($1)}; END {print max}'); pacman -Q | cut -d ' ' -f 1 | xargs pacman -Qi | awk -v w="$max_len" '/^Name/ {printf "%-"w"s", $3}; /^Description/ {print $0}' | sed 's/Description[[:space:]]*: / /'
    # awk '{if (length($1) > max) max=length($1)}; END {print max}'  命令对  pacman -Q  命令的输出进行处理,计算出软件包名称的最大长度
    

    输出示例:

    archlinux-keyring       Arch Linux PGP keyring
    base                    Minimal package set to define a basic Arch Linux installation
    bash                    The GNU Bourne Again shell
    bzip2                   A high-quality data compression program
    ca-certificates         Common CA certificates (default providers)
    ca-certificates-mozilla Mozilla's set of trusted CA certificates
    ca-certificates-utils   Common CA certificates (utilities)
    coreutils               The basic file, shell and text manipulation utilities of the GNU operating s
    cryptsetup              Userspace setup tool for transparent encryption of block devices using dm-crypt
    curl                    command line tool and library for transferring data with URLs
    ......
    

好玩的配置

# https://www.linux.com/news/10-truly-amusing-easter-eggs-linux
# pacman输出内容变为彩色
grep "^Color" /etc/pacman.conf >/dev/null || sudo sed -i "s/^#Color/Color/" /etc/pacman.conf
# pacman进度条吃糖果动画
grep "ILoveCandy" /etc/pacman.conf >/dev/null || sudo sed -i "/#VerbosePkgLists/a ILoveCandy" /etc/pacman.conf

忽略某些软件包的更新

# vim /etc/pacman.conf
IgnorePkg = package1 package2 package3

常见问题

  1. unable to lock database

    执行 sudo pacman -Syyu 时报错,输出如下:

    ➜ sudo pacman -Syu
    :: Synchronizing package databases...
    error: failed to update core (unable to lock database)
    error: failed to update extra (unable to lock database)
    error: failed to update community (unable to lock database)
    error: failed to update multilib (unable to lock database)
    error: failed to synchronize all databases
    

    我碰到这个问题是因为在执行一次更新过程中电脑死机了, 强制关机重启后, 再次执行更新报了这个错。

    谢天谢地, 系统没挂。也是第一次碰到更新过程中死机的情况,还以为要重装系统了呢。

    解决办法:

    sudo rm -rf /var/lib/pacman/db.lck
    

    参考: