Linux 介绍_7 家目录

家目录

我的博客
将以如下几个部分进行讨论:

  • 组织你的环境
  • 常用的 shell 配置文件
  • shell 配置
  • 配置提示符
  • 安装新软件
  • 更新现有的包

注意: 文中的内容可能因人而异,因系统而异

维护好家目录

介绍

把使用的环境弄得脏乱,是十分简单的事。下面的方式可以帮助你维持一个良好的环境。

  • 为你自己的程序文件以及脚本制作一个 bin 目录
  • 将不可执行文件放置在合适的目录中,比如将图像、文档、下载文件、个人文件等分别放置到自己创建的目录下
  • 通过 chmod 700 dirname 将目录私有化
  • 为你的文件起一个见名知意的名字,比如 给总统的提案 1573 而不是 信笺1

制造空间

清空文件

有时候文件的当前内容对你而言并不重要,相反,你需要使用这个文件的文件名,那么在 Bash shell 中可以使用重定向来清空文件:

arv@arv:~$ cat wishlist > placeholder

arv@arv:~$ ls -la placeholder
-rw-rw-r-- 1 arv arv 59 1月   9 10:47 placeholder

arv@arv:~$  > placeholder

arv@arv:~$ ls -la placeholder
-rw-rw-r-- 1 arv arv 0 1月   9 10:47 placeholder

也可以使用 touch 命令创建空文件,如果使用 touch 文件创建已经存在的文件,那么只会更新这个文件的时间戳。

如果想要保留文件中最后的内容,可以使用 tail 命令。比如你的愿望清单过长了,可以通过如下的命令保留最后的五行愿望内容:

arv@arv:~$ tail -5 wishlist > newlist
arv@arv:~$ cat newlist > wishlist
arv@arv:~$ rm newlist

关于日志文件

一些 Linux 程序会将输入写入到日志文件中。通常具有选项选择只记录错误或只记录最小量的信息,比如,设置程序的 debug 等级。即使这样,你可能也并不在意日志文件。下面是一些小帮助:

  • 程序不再运行时,如果确定不再需要这个日志文件,那么删除日志文件
  • 如果你移除了日志文件,程序又再次创建了它,读取这个程序的文档来找到关闭记录日志的选项
  • 尝试只记录自己需要的信息,来缩减日志文件的大小,或只记录重要信息
  • 尝试使用符号链接到 /dev/null 来替换日志文件,如果程序没有报错就行

邮件

定期清理你的邮箱。

使用链接节省空间

如果多个用户需要访问相同的文件或程序,而源文件名又太长难以记忆,那么使用一个符号链接,而不是直接为每个用户复制这个文件。

多个符号链接可以具有不同的名称。

限制文件大小

shell 包含一个内建的命令来限制文件大小,ulimit,它也可以用来展示系统资源的限制:

arv@arv-OptiPlex-7090:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127052
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127052
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

压缩文件

压缩文件可以节约存储需要的空间,可以减少传输时候使用的带宽。很多文件,比如 man 页面,是以压缩格式存储在你的系统中的。我们在需要他们的时候,并不是将它们解压出来放到硬盘上,然后再读取它们,相反我们可以使用 zgrepzcatbzless 这样的工具,将它们解压到内存上,它们的源压缩文件依旧保持原样,来节省空间。


你的文本环境

环境变量

通用

我们在前面已经提到过一些环境变量了,诸如 PATHHOME 等。一些 Linxu 实例需要一些环境变量信息来更好地工作。

一些程序需要知道你使用的终端,这个信息保存在 TERM 变量中。在文本模式下,将会是 linux 终端,在图形模式下,通常是 xterm。一些程序需要知道你使用的编辑器是什么。你使用的 shell 保存在 SHELL 变量中,操作系统类型保存在 OS 变量中。通过 printenv 命令,可以查看当前环境使用的环境变量。

环境变量被 shell 管理。环境变量会被启动的程序继承,包括另一个 shell。新的进程被分配了这些变量的一个副本,它们可以读、调整并传递给它们自己的子进程。

这些变量名,除了以惯例按照大写字母书写的,没有什么特别的。你可以按照自己的习惯,起一个名称。

导出变量

使用 echo 命令可以将变量中包含的内容打印出来:

debby:~$ echo $PATH
/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin:/usr/local/bin
debby:~$ echo $MANPATH
/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man

如果你希望修改这个变量的内容,需要将从你的环境中,将变量导出到执行程序的环境中。一个常用的例子是导出 PATH 变量。为了能够执行 /opt/FligtGear/bin: 目录下的程序,需要:

debby:~$ PATH=$PATH:/opt/FlightGear/bin

这个指示 shell 会除了在之前的 PATH 下查找可执行的命令,还会在 /opt/FlightGear/bin 目录下查找。

但是只要环境不知道这个新的变量指,那么还是不能正常工作:

debby:~$ runfgfs
bash: runfgfs: command not found

使用 export 将变量导出到环境中:

debby:~> export PATH

debby:~> runfgfs
--flight simulator starts--

Bash 中,我们只需要一步就能完成:

export VARIABLE=value

保留变量

下表给出已经预定义的变量:

变量名 存储信息
DISPLAY X Window 使用来确定显示服务
DOMAIN 域名
EDITOR 存储你最喜欢的编辑器
HISTSIZE shell 历史的保存的行数
HOME 你的家目录的路径
HOSTNAME 本地主机名
INPUTRC 输入设备的定义文件位置
LANG 语言
LD_LIBRARY_PATH 搜索库路径
LOGNAME 登录名
MAIL 邮箱文件夹路径
MANPATH man 页面搜索路径
OS 操作系统描述
OSTYPE 操作系统更详细描述
PAGER 输出操作终端窗口时要做的操作
PATH 命令搜索路径
PS1 提示符首选项
PS2 提示符此选项
PWD 当前工作目录
SHELL 当前 shell
TERM 终端类型
UID 用户 ID
USER 用户名
VISUAL 最喜欢的全屏编辑器
XENVIRONMENT X 行为个人设置位置
XFILESEARCHPATH 搜索图形库的路径

shell 配置文件

在使用 ls -al 列出所有文件时,会列出以 . 开头的隐藏文件,在你的家目录下,你会看到一个或多个以 . 开头,以 rc 做结尾的文件。以 bash 为例为 .bashrc。这个文件是系统范围配置文件 /etc/bashrc 对应项。

当登录到交互式的 shelllogin 将会完成认证、配置环境、启动 shell 工作。以 bash 为例,下一步会读取 /etc 目录下的 profilebash 之后按顺序查找 ~/.bash_profile~/.bash_login 以及 ~/.profile,并从第一个可读项中读取执行命令。如果不存在,那么应用 /etc/bashrc

如果 login shell 存在,bash~/.bash_logout 中读取命令命令。

配置文件的典型配置

/etc/profile 例子

首先是 /etc/profile 文件,在这文件中配置了一些重要的变量,比如 PATHUSER 以及 HOSTNAME,下面是官方文档中的内容:

debby:~> cat /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# Path manipulation
if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/sbin" ; then
    PATH=/sbin:$PATH
fi
if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/sbin" ; then
    PATH=/usr/sbin:$PATH
fi
if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/local/sbin"
    then
    PATH=/usr/local/sbin:$PATH
fi
if ! echo $PATH | /bin/grep -q "/usr/X11R6/bin" ; then
    PATH="$PATH:/usr/X11R6/bin"
fi

这些逻辑判断需要设置的路径,如果 root 登录了 shell,那么将会检查 sbin/usr/sbin 以及 /usr/local/sbin。如果不是 root 用户,那么为每一个用户检查 /usr/X11R6/bin 路径。

下面的设置将会使所有的垃圾进入到 /dev/null 中:

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

下面对一些常见变量设置它们合适的值:

USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"

HOSTNAME=`/bin/hostname`
HISTSIZE=1000

下面的设置中,如果变量 INPUTRC 未被设置,且用户的家目录中未找到 .inputrc 文件,则加载默认的输入控制文件:

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi

下面的命令将所有的变量都导出到环境:

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

下面是我的 Ubuntu-20.04 在安装完之后默认的内容:

arv@arv:~$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

profile.d 目录

for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
        . $i
    fi
done
unset i

所有在 /etc/profile.d 目录下的可执行文件都被读取并执行。这个过程会执行诸如使能 color-ls,重命名 vimvi等,临时变量 i 最后 unset 是为了防止它在后续过程中污染 shell 行为。

.bash_profile 例子

之后 bash 在用户的家目录查找 .bash_profile 文件:

debby:~> cat .bash_profile 
#################################################################
#                                                               #
#   .bash_profile file                                          #
#                                                               #
#   Executed from the bash shell when you log in.               #
#                                                               #
#################################################################
source ~/.bashrc
source ~/.bash_login

直接读取 ~/.bashrc 以及 ~/.bash_login 文件,在 shell 环境下工作,你会经常遇到 shell 内建命令 source: 它用来为当前的环境变化做配置。

.bash_login 例子

~/.bash_login 文件通过设置 umask 值定义默认的文件保护。~/.bashrc 文件用来定义一系列用户定义的行为功能以及个人环境变量。首先会读取 /etc/bashrc,它描述了默认的提示符 PS1,以及默认的 umask 值。在这之后,用户可以添加自己的配置。如果没有 ~/.bashrc,那么默认读取 /etc/bashrc

/etc/bashrc 例子

你的 /etc/bashrc 文件看起来可能像:

debby:~> cat /etc/bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# by default, we want this to get set.
# Even for non-interactive, non-login shells.
if [ `id -gn` = `id -un` -a `id -u` -gt 99 ]; then
        umask 002
else
        umask 022
fi

这些行设置 umask 值。之后,依赖于 shell 的类型,设置提示符:

# are we an interactive shell?
if [ "$PS1" ]; then
  if [ -x /usr/bin/tput ]; then
    if [ "x`tput kbs`" != "x" ]; then 
# We can't do this with "dumb" terminal
      stty erase `tput kbs`
    elif [ -x /usr/bin/wc ]; then
      if [ "`tput kbs|wc -c `" -gt 0 ]; then 
# We can't do this with "dumb" terminal
        stty erase `tput kbs`
      fi
    fi
  fi
  case $TERM in
        xterm*)
        if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
                PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
        else
   PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:\
${PWD/$HOME/~}\007"'
        fi
    ;;
        *)
   [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=\
/etc/sysconfig/bash-prompt-default
            ;;
    esac
    [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
    if [ "x$SHLVL" != "x1" ]; then # We're not a login shell
        for i in /etc/profile.d/*.sh; do
            if [ -x $i ]; then
                . $i
            fi
        done
    fi
fi

.bash_logout 例子

在退出登录时,在 ~/.bash_logout 文件被执行,可以进行清除终端命令:

debby:~> cat .bash_logout
# ~/.bash_logout
clear

Bash 提示符

介绍

Bash 提示符可以展示诸如你的用户名,你的设备名,以及指示当前所处目录。我们也可以添加其他信息,比如当前日期与时间,当前连接的用户等:
在我们开始之前,我们首先备份我们当前的提示符到另一个环境变量:

[jerry@nowhere jerry]$ MYPROMPT=$PS1
[jerry@nowhere jerry]$ echo $MYPROMPT
[\u@\h \W]\$
[jerry@nowhere jerry]$

这样在我们修改提示符之后,我们总是能够通过之前保存的环境变量 PS1=$MYPROMPT 来恢复现场。

一些例子

为了理解这些提示符与转义字符,我们查看 man 页面:

  • export PS1="[\t \j] "
    以天的形式展示时间,另一个为运行的工作数
  • export PS1="[\d] [\u@\h \w] : "
    展示日期,用户名,主机名以及当前工作目录,注意 \W 只会展示当前工作目录的文件名,而不是完整路径
  • export PS1="{\!} "
    展示每一个历史命令的数量
  • export PS1="\[\033[1;35m\]\u@\h[\033[0m\] "
    展示 用户名@主机名 为粉色
  • export PS1="\[\033[1;35m\]\u\[\033[0m\] \[\033[1;34m\]\w\[\033[0m\] "
    设置用户名为粉色,当前工作目录为蓝色
  • export PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] "
    为提示符添加底色
  • export PS1="\[\033[4;34m\]\u@\h \w \[\033[0m\]"
    为提示符添加下划线
  • export PS1="\[\033[7;34m\]\u@\h \w \[\033[0m\] "
    蓝色背景下的白色字符
  • export PS1="\[\033[3;35m\]\u@\h \w \[\033[0m\]\a"
    粉色提示符浅色字体
  • export PS1=...

将你喜欢的提示符配置行配置到你的 ~/.bashrc 文件中吧。当然提示符还有更多的新奇玩法,可以参考这个文章

shell 脚本

什么是脚本

所有的 shell 脚本,都是包含 shell 命令的文本文件。如果在 Bash 下执行这个文件,而不使用 -c-s 选项时,Bash 会从文件中读取命令并执行命令,最后退出。这个操作创建了一个非交互 shell。当 Bash 运行一个 shell 脚本时,它设置文件名为特殊参数 0,依次为后续的参数赋加值。

一个 shell 脚本可以通过使用 chmod 命令来将可执行位置位,当 Bash 搜索 PATH 路径找到这个文件时,它会生成一个子 shell 执行文件。换言之,执行:

filename arguments

等效于执行:

bash filename arguments

如果 filename 是一个可执行 shell 脚本,子 shell 会重新初始化自身,等效于一个新的 shell 调用来解释这个脚本。

如果脚本的起始具有字符 #!,那么后面的内容要使用指定的解释器对脚本进行解释。因此你可以指定 bashawkperl 等完成脚本的解释,当然也要使用对应的脚本语言进行脚本编写。

Bash 脚本通常以如下开头:

#! /bin/bash

一些简单的例子

一个非常简单的例子如下,只有一行组成,打印一串字符到桌面:

[jerry@nowhere ~] cat hello.sh
#!/bin/bash
echo "Hello $USER"

这个脚本只由一个命令组成 echo,使用 $USER 来给出用户名。

打印当前连接的用户:

#! /bin/bash
who | cut -d " " -f 1 | sort -u

下面的脚本可以备份当前目录下的所有文件,并将备份的文件打印到屏幕:

#! /bin/bash
# make copies of all files in a directory
LIST=`ls`
for i in $LIST; do
        ORIG=$i
        DEST=$i.old
        cp $ORIG $DEST
        echo "copied $i"
done

/etc/rc.d/init.d 目录中,包含一些例子,让我们以一个 ICanSeeYou 服务器控制脚本为例:

#!/bin/sh
# description: ICanSeeYou allows you to see networked people
# process name: ICanSeeYou
# pidfile: /var/run/ICanSeeYou/ICanSeeYou.pid
# config: /etc/ICanSeeYou.cfg
# Source function library.
. /etc/rc.d/init.d/functions
# See how (with which arguments) we were called.
case "$1" in
        start)
                echo -n "Starting ICanSeeYou: "
                daemon ICanSeeYou
                echo
                touch /var/lock/subsys/ICanSeeYou
                ;;
        stop)
                echo -n "Shutting down ICanSeeYou: "
                killproc ICanSeeYou
                echo
                rm -f /var/lock/subsys/ICanSeeYou
                rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
                ;;
        status)
                status ICanSeeYou
                ;;
        restart)
                $0 stop
                $0 start
                ;;
        *)
                echo "Usage: $0 {start|stop|restart|status}"
                exit 1
esac
exit 0

首先通过 . 命令,一个 shell 函数被载入。之后 case 命令确定要执行的操作,比如 ICanSeeYou start。通过 $1 的参数来确定要执行的动作。如果没有输入参数,将会执行默认动作,* 被执行。caseesac 语句结束。在 stop 参数执行时,服务器进程被追踪关闭,进程锁以及进程 ID 被移除。
若执行成功,脚本返回 0 到调用它的父进程。

这个脚本是一个不错的例子,可读性很好,执行效率也高。注意到它使用 sh 而不是 bash,这是为了让这个脚本支持更多的系统。

学习写自己的脚本


安装新软件

通用

只要你想要,你可以在任何使用更新你的系统,向你的系统添加包。大部分软件以包的形式安装。软件可以在网络上获取也可以从盘上获取。所有的软件都会有 README 文件,帮助你了解软件的安装使用方法。

包格式

RPM

什么是 RPM

RPM,即 RedHat Package Manager 的缩写,是一个强力的包管理工具,可以用来安装、升级、移除包。它允许你查找指定的包跟踪包的文件。
一个 RPM 包由打包的文件以及元数据组成,元数据用来安装、擦除打包的文件。元数据包含帮助脚本、文件属性以及包的描述信息。包具有两种形式:

  • 二进制包,封装了可安装的软件
  • 源码包,包含软件的源码以及需要的配方来生成二进制包
RPM 例子

大部分包通过 upgrade 选项 -U 就可以安装,无论这个包是否已经安装。RPM 包包括程序的完整版本,它可以对现有的版本进行升级或安装新的包。典型的使用方法:

rpm -Uvh /path/to/rpm-package(s)

其中 -v 选项生成一些打印,帮助了解过程,-h 选项生成一个进度条:

[root@jupiter tmp]# rpm -Uvh totem-0.99.5-1.fr.i386.rpm
Preparing...                ########################################### [100%]
   1:totem                  ########################################### [100%]
[root@jupiter tmp]#

新的内核包,通过选项 -i 安装,不会覆写现有的包版本。这个方式下,如果新的内核不能正常工作,你依然可以启动老的内核版本。

你可以使用 rpm 来检查一个包是否已经安装到你的系统:

[david@jupiter ~] rpm -qa | grep vim
vim-minimal-6.1-29
vim-X11-6.1-29
vim-enhanced-6.1-29
vim-common-6.1-29

或者,你可以找到哪个包包含特定的文件或可执行:

[david@jupiter ~] rpm -qf /etc/profile
setup-2.5.25-1
[david@jupiter ~] which cat
cat is /bin/cat
[david@jupiter ~] rpm -qf /bin/cat
coreutils-4.5.3-19

注意,你不需要通过管理员权限即可通过 rpm 访问 RPM 数据库。只有在添加、调整或删除包时,需要使用 root 身份。

下面通过 rpm 移除安装的软件:

[root@jupiter root]# rpm -e totem
[root@jupiter root]#

注意到,移除软件默认情况下是没有多余的打印的,可以使用 rpm -qa 来查看已经移除了指定的包。

查看更多的相关信息

DEB(.deb)

什么是 Debian

这个包格式默认在 Debian GNU/Linux 上,标准管理包的工具在老版本上是 dselect 现在通常是 aptitude。用来选择你想要安装或升级的包,它还在安装 Debian 系统时运行,帮助定义使用的访问方式、列出可用的包与对包进行配置。

现在,Debian 包格式越来越流行。现在 apt-get 也越来越流行。

DEB 工具例子

通过 dpkg 命令查看包是否已安装,比如,如果你想要知道你的 vim 软件的版本,使用如下命令:

Arvin ~ dpkg -l *vim*
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器 >
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称              版本                体系结构     描述
+++-=================-===================-============-=============================>
un  gvim              <无>                <无>         (无描述)
ii  vim               2:8.1.2269-1ubuntu5 amd64        Vi IMproved - enhanced vi edi>
ii  vim-addon-manager 0.5.10              all          manager of addons for the Vim>
ii  vim-asciidoc      9.0.0~rc1-1         all          Vim syntax highlighting files>
un  vim-athena        <无>                <无>         (无描述)
ii  vim-common        2:8.1.2269-1ubuntu5 all          Vi IMproved - Common files
un  vim-doc           <无>                <无>         (无描述)
un  vim-gnome         <无>                <无>         (无描述)
un  vim-gtk           <无>                <无>         (无描述)
un  vim-gtk3          <无>                <无>         (无描述)
un  vim-nox           <无>                <无>         (无描述)
ii  vim-runtime       2:8.1.2269-1ubuntu5 all          Vi IMproved - Runtime files
un  vim-scripts       <无>                <无>         (无描述)
ii  vim-tiny          2:8.1.2269-1ubuntu5 amd64        Vi IMproved - enhanced vi edi>

其中 ii 表示包已安装。如果有 un,表示包在设备上,但是没有安装。

搜索文件属于哪一个包通过 -S 选项实现:


Arvin ~ dpkg -S /bin/cat
coreutils: /bin/cat

源码包

大部分 Linux 程序都是开源的 (Free/Open),因此可以获取到这些程序的源码包。可以从官方网站上下载到源码的压缩包 (就是我们一般说的 tarball,program-version.tar.gz)。对于基于 RPM 的版本,源码通常是以 program-version.src.rpm 形式提供的。Debian 以及大部分基于它的版本,提供它们自己的适配包,可以通过 apt-get source 获取到。

特殊的需求、依赖关系以及安装命令在 README 文件中提供。你可能需要 C 编译器 gcc,这个 GNU C 编译器包含在大部分 Linux 系统中,可以一直到很多平台上。

自动化包管理与更新

一般说明

在安装完新系统之后,要执行一下更新操作。

APT

这是 Debian 系统的默认包管理工具。主要的优点是 APT 是免费灵活使用的。第一次使用 apt-get 需要获取到一个可获取包的索引,这是通过如下命令实现的:

apt-get update

在这之后,你可以使用 apt-get 来更新你的系统:

apt-get upgrade

除了这个常用的内容,apt-get 也可以用来快速安装独立的包:

$ sudo apt-get install xsnow
Password:
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  xsnow
  0 packages upgraded, 1 newly installed, 0 removed and 3 not upgraded.
Need to get 33.6kB of archives.
After unpacking 104kB of additional disk space will be used.
Get:1 http://ayo.freshrpms.net redhat/9/i386/os xsnow 1.42-10 [33.6kB]
Fetched 33.6kB in 0s (106kB/s)
Executing RPM (-Uvh)...
Preparing...                ########################################### [100%]
   1:xsnow                  ########################################### [100%]

如果有依赖其他包,apt-get 可以下载并安装这些支持包。

posted @ 2022-01-10 21:51  ArvinDu  阅读(44)  评论(0编辑  收藏  举报