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
页面,是以压缩格式存储在你的系统中的。我们在需要他们的时候,并不是将它们解压出来放到硬盘上,然后再读取它们,相反我们可以使用 zgrep
、zcat
、bzless
这样的工具,将它们解压到内存上,它们的源压缩文件依旧保持原样,来节省空间。
你的文本环境
环境变量
通用
我们在前面已经提到过一些环境变量了,诸如 PATH
、HOME
等。一些 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 | 登录名 |
邮箱文件夹路径 | |
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
对应项。
当登录到交互式的 shell
,login
将会完成认证、配置环境、启动 shell
工作。以 bash
为例,下一步会读取 /etc
目录下的 profile
。bash
之后按顺序查找 ~/.bash_profile
,~/.bash_login
以及 ~/.profile
,并从第一个可读项中读取执行命令。如果不存在,那么应用 /etc/bashrc
。
如果 login shell
存在,bash
从 ~/.bash_logout
中读取命令命令。
配置文件的典型配置
/etc/profile
例子
首先是 /etc/profile
文件,在这文件中配置了一些重要的变量,比如 PATH
、USER
以及 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
,重命名 vim
为 vi
等,临时变量 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
调用来解释这个脚本。
如果脚本的起始具有字符 #!
,那么后面的内容要使用指定的解释器对脚本进行解释。因此你可以指定 bash
、awk
、perl
等完成脚本的解释,当然也要使用对应的脚本语言进行脚本编写。
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
的参数来确定要执行的动作。如果没有输入参数,将会执行默认动作,*
被执行。case
以 esac
语句结束。在 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
可以下载并安装这些支持包。