个人工具
104.160.18.24
该IP地址的讨论
登录
查看“UbuntuManual:Ubuntu指南”的源代码 - Ubuntu中文
页面
讨论
查看源代码
历史
搜索
导航
首页
最近更改
随机页面
页面分类
帮助
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息
查看“UbuntuManual:Ubuntu指南”的源代码
来自Ubuntu中文
←
UbuntuManual:Ubuntu指南
跳转至:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
{{UbuntuManual}} == 第 4 章 - Ubuntu指南 == 这一节为真正的新手提供一个熟悉的 Ubuntu 世界,如果您已经使用了一段时间的类unix操作系统,那么您应该已经了解我在这里所说的一切。那么请用这个来做一个实战检验。 === 开始了 === 在您的电脑上安装完 Ubuntu 系统以后,您需要学习一点东西以便使用它,让我们来给您做一个快速的培训。 ==== 用超级用户登录到命令提示符 ==== 在重新启动系统的时候,您处在一个图形的登录界面,或者字符界面的登录界面,这个取决于您初始安装时所选择的发行版本,简单的说,如果您现在处在图形登录界面, 那么按下 Ctrl-Alt-F1 来获得字符界面。 假设您的主机名是foo,那么登录提示符看起来是这样的: <pre><nowiki> foo login: </nowiki></pre> 输入用户名也就是你安装时设置的用户名,我们假设用户名为 ubuntu,如果采用 oem 方式安装,则用户名为 oem ,然后按回车键,然后会提示输入密码,就是您在安装过程中所输入的密码。在 Ubuntu 系统中,按照 Unix 的习惯,密码是不可见的。然后系统就会输出欢迎 信息而且给出 $ 的命令提示符等待您的输入。 <pre><nowiki> foo login: ubuntu Password: Linux backup 2.6.15-25-686 #1 SMP PREEMPT Wed Jun 14 11:34:19 UTC 2006 i686 GNU/Linux The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. You have new mail. Last login: Tue Jul 4 13:24:05 2006 on tty3 ubuntu@foo:~$ </nowiki></pre> 现在输入 sudo -sH ,会再次输入密码,输入相同的登录密码后,回车,切换到 root 帐号: <pre><nowiki> ubuntu@foo:~$ sudo -sH sudo: please use single character options Password: root@@foo:~# </nowiki></pre> 您现在已经准备好通过root的命令提示符进行系统的管理。这个root帐户也被称为超级 用户或者特权用户。拥有这个帐户,您将可以做任何事情: * 读,写和删除任何文件而不用去理会它们所要求的权限 * 设置文件的归属,以及系统里面任何文件的访问权限 * 登录到任何帐户而不需要他们的密码 通过和别人共享root用户的密码来共享root帐户是一个非常糟糕的想法。而使用程序比如 sudo(8)是共享管理权限的好方法。 请注意,优先使用非特权用户登录被认为是一个好的Unix习惯,哪怕是您要进行管理活动, 在必要的时候您也可以使用sudo, super,或者 su -c来 获得有限的root权限。 See 更安全地工作 – sudo, 第 9.2.4 节. ==== 设置最小的新手环境 ==== 我认为学习一个电脑系统就像学习一门新的外语。尽管书本指南是有帮助的,但是您需要 练习使用帮助工具。在这个情况下,我认为安装一些额外的软件包是一个好主意,比如 mc, vim, lynx, doc-linux-text, and debian-policy. <pre><nowiki> # apt-get update ... # apt-get install mc vim lynx doc-linux-text debian-policy ... </nowiki></pre> 如果您已经安装了这些软件包,那么什么都不需要安装了。 ==== 添加一个用户 ==== 在安装过程中,您通常已经创建了一个非特权用户来接收发送给root帐户的e-mail。 因此您也不希望用这个特殊的帐户来进行下面的训练,那么您需要创建另外一个帐户。 假设您希望新帐户的名字叫penguin, 输入: <pre><nowiki> root@foo:root# adduser penguin ... 回答所有的问题 </nowiki></pre> 这样就可以了。 在更进一步之前,我们先来学习一点东西 ==== 在不同的控制台之间切换 ==== 在默认的 Ubuntu 系统中,有6个独立的伪终端,比如,您可以把PC的VGA字符终端当作 6个可以选择的VT-100终端来使用。从一个切换终端到另外一个,你只需要同时按下左Alt键 +Ctrl键和F1 –:F6键。任何一个伪终端都可以让不同的用户独立登录。多用户环境是 Unix 的 一个很优秀的、使人迷恋的特性。 如果你偶然的在装有X装口系统的系统上按下了Alt+Ctrl+F7,控制台就会切换到图形界面,然后 再按下Ctrl-Alt-F1可以重新回到字符界面。您可以尝试在在不同的控制台之间切换,然后 再换回到原来的那个,您慢慢就会习惯于这样做。 ==== 怎样关闭机器 ==== 就像任何其它现代的操作系统一样,任何文件操作都会在内存当中缓存数据,Ubuntu 操作系统也需要一个适当的过程,让电脑电源关闭之前保证这些文件的一致性,您可以在 root 命令提示符下使用下面的命令来关闭系统。 <pre><nowiki> # shutdown -h now </nowiki></pre> 上面是在正常的多用户模式下面的方法。如果您是处在单用户模式,您可以在root用户的命令提示符下使用下面的命令: <pre><nowiki> # poweroff -i -f </nowiki></pre> 可选择的其它方式,比如您可以用Ctrl-Alt-Delete来关闭系统 默认系统会自动关闭电源,如果APM和ACPI选项在 BIOS和Linux内核里面都配置有问题的话,等待系统在屏幕上输出"System halted"之后您就可以关闭电源了。可以看 多内存和关机自动断电, 第 3.8.4 节获得详细信息。 ==== 玩的时间 ==== 现在您已经准备好使用 Ubuntu 系统了,而不用担心有任何冒险,因为您使用的非特权用户 penguin。 让我们先登录到 penguin 用户。 如果您现在正在root用户的命令提示符下面,输入 exit 在root用户提示符下面关闭root的shell以后我们就返回了 ubuntu 用户提示符,再次输入 exit ,返回登录提示符。输入您刚创建的新 用户名penguin和对应的密码。 您将会获得如下的命令提示符 <pre><nowiki> penguin@foo:penguin$ </nowiki></pre> 从现在开始,为了简单起见我们将使用简化的命令提示符,我们将使用: * # : root的命令提示符 * $ : 非特权用户的命令提示符 我们将先用简单的方法 Midnight Commander (MC), 第 4.2 节来学习 Ubuntu ,稍后使用较好的方法 类 Unix 工作环境, 第 4.3 节。 === Midnight Commander (MC) === Midnight Commander (MC)是Linux控制台和其它终端环境中的GNU“瑞士军刀”。这给予了新手一个菜单驱动控制台的体验,它比Unix标准命令容易学的多。 用命令来研究 Ubuntu 系统。这是最好的学习方法。请不使用键盘而只用鼠标和回车键来访问下面的地址: * /etc 和它的子目录。 * /var/log 和它的子目录。 * /usr/share/doc 和它的子目录。 * /sbin and /bin ==== 提高 MC ==== 为了让MC在退出的时候改变工作目录,您需要修改 ~/.bashrc(或者/etc/bash.bashrc,查看.bashrc),使用-P选项在它的 手册里面可以获取更详细的信息mc(1). ==== 启动MC ==== <pre><nowiki> $ mc </nowiki></pre> 在MC中用户可轻而易举使用菜单完成所有的文件操作。可以按F1获得帮助,您可以只用鼠标和功能键来操作MC。 ==== MC 里的文件管理器 ==== 默认状态下,所有文件列于两个目录面板。一种实用的方式是将右边窗口设定为“information”,用来查看文件访问权限等信息。下面是一些基本的击键。如果gpm daemon在运行,你还可以使用鼠标。(在MC中进行剪切和粘贴操作时别忘了按下shift键。) * F1: 帮助菜单 * F3: 内置文件阅读器 * F4: 内置编辑器 * F9: 激活折叠菜单 * F10: 退出Midnight Commander * Tab: 在两个窗口间移动 * Insert: 为多文件操作生成文件如拷贝 * Del: 删除文件(小心—请设置MC为安装删除模式) * Cursor keys: 与各自的名字一致 ==== MC里的命令行技巧 ==== * cd命令可改变焦点屏幕中的目录位置。 * Control-Enter或Alt-Enter可以将文件名拷贝到命令行。在编辑命令行时可与cp或mv命令结合使用。 * Alt-Tab显示焦点文件所属文件或目录的文件名 * 可指定MC两个目录窗口的起始目录;例如mc /etc /root。 * Esc + numberkey ===== Fn(例如 Esc + '1' ===== F1, etc.; Esc + '0' ==== F10) * Esc- key ==== Alt-key (== Meta, M-); 例如Esc + 'c'等价于Alt-c ==== MC 里面的编辑器 ==== 内置编辑器的剪切-粘贴方式很有意思。按F3在起始处做标记,再次按F3在终止处做标记,这时中间的选中部分会高亮显示。然后你可以移动光标到某处按下 F6,被选中部分就会移到该处。如果你按下的是F5,选中部分就会拷贝到该处。F2用来存盘,F10退出,所有方向键的作为和它们的名字一样直观。 该编辑器可直接打开某个文件: <pre><nowiki> $ mc -e filename_to_edit $ mcedit filename_to_edit </nowiki></pre> 虽然它不是多窗口编辑器,但你可利用Linux多控制台的特性达到相同的效果。要在窗口间进行拷贝操作,可使用Alt-Fn切换虚拟控制台,然后使用“File->Insert file”或“File->Copy to file”将一个文件中的内容拷贝到另一个文件。 可指定任何外部编辑器作为内置编辑器。 许多程序使用环境变量EDITOR或VISUAL来决定使用哪个编辑器。如果你用不惯vim,可在~/.bashrc中加上几行来指定新的mcedit: <pre><nowiki> ... export EDITOR=mcedit export VISUAL=mcedit ... </nowiki></pre> 我强烈推荐将它们设定为vim。在Linux/Unix世界里就该使用vi(m)命令。 ==== MC 里的阅读器 ==== 非常精巧的阅读器。它是在文档中搜索单词的利器。在/usr/share/doc目录下我总是用它,面对大量的Linux资料用它浏览是最快的方法。阅读器可以直接找开文件: <pre><nowiki> $ mc -v filename_to_view </nowiki></pre> ==== MC的自动启动特性 ==== 在文件上按Enter,会激活相关的程序操作该文件。这是MC的一个极方便的特点。 <pre><nowiki> executable file: 执行命令 man, html file: 将文件内容传入阅读器程序 tar, gz, deb file: 象浏览子目录一样浏览它的内容 </nowiki></pre> 为了使这些阅读器和虚拟文件的属性能够被查看,不要将可阅读文件设成可执行文件。可在MC文件菜单中改变文件属性或使用chmod命令。 ==== MC 里的FTP虚拟文件系统 ==== MC可通过FTP访问文件。按F9转到菜单栏,输入’p’激活FTP虚拟文件系统。按username:passwd@hostname.domainname格式输入URL,远程文件目录就会以本地目录的方式显示出来。 在URL里试着用http.us.debian.org/debian来浏览Debian存档文件。看 Ubuntu 文件, 第 2.1 节 就知道这些是怎么被识别的了。 === 类 Unix 工作环境 === 尽管MC让您能够做绝大多数的事情,但是利用shell来学习命令行工具,和熟悉类Unix系统 的工作环境还是很重要的。 ==== 特殊的按键组合 ==== 在类Unix环境里,有一些按键有特殊的意思。 * Ctrl-U: 擦除一行光标前面的部分。 * Ctrl-H: 擦除光标前面的一个字符。 * Ctrl-D: 终止输入。(退出shell,如果您正在使用shell的话)。 * Ctrl-C: 终止当前正在运行的程序。 * Ctrl-Z: 暂停程序。 (把它放到后台运行请看 command &, 第 4.3.10.1 节) * Ctrl-S: 停止向屏幕输出。 * Ctrl-Q: 重新激活向屏幕输出。 默认的shell,bash, 有历史编辑和tab补齐功能。 * up-arrow: 开始历史命令搜索。 * Ctrl-R: 开始增量历史命令搜索。 * TAB: 完整的把文件名输入到命令行。 * Ctrl-V TAB: 输入TAB而不是扩展命令行。 其他一些需要记住的按键组合。 * Ctrl-Alt-Del:挂起或者重新启动系统 初始化安装完成后再安装其他软件包, 第 3.8.1 节. * Left-click-and-drag mouse: 选择并且拷贝到剪贴板。 * Click middle mouse button: 使用剪贴板的内容粘贴。 * Meta-key (Emacs terminology) 传统的是使用 Left-Alt-key. 但是有些系统使用 Windows-key实现 Meta-key. 这里,为了在Linux字符界面下使用鼠标,您需要使用gpm服务。 查看 鼠标设置, 第 3.3 节。 ==== 基本 Unix 命令 ==== 让我们来学习基本的Unix命令。 使用非特权用来执行下面的所有的命令。 penguin : * pwd ** 显示当前工作路径。 * whoami ** 显示当前用户名。 * file foo ** 显示foo文件的属性。 * type -p commandname ** 显示命令commandname所的的地方。 ** which commandname也可以用来做这个 . * type commandname ** 显示命令 commandname的信息。 * apropos key-word ** 找到和 key-word相关的命令。 ** man -k key-word也可以做到 * whatis commandname ** 显示该命令的一句话帮助。 commandname. * man -a commandname ** 显示命令的解释信息。 commandname. (Unix style) * info commandname ** 显示很长的命令解释 commandname. (GNU style) ls ** 列出目录内容 (非以.开始的文件和目录) * ls -a ** 列出目录内容(所有的文件和目录) * ls -A ** 列出目录内容。(几乎所有的文件和目录,略去".." and ".") * ls -la ** 列出目录所有文件和目录的详细信息。查看 Ubuntu 中的文件系统概念, 第 4.5.2 节。 * ls -d * ** 列出当前目录下的目录名称,而不是目录下的内容。 * lsof foo ** 显示文件foo的打开状态。 * mkdir foo ** 在当前目录下创建一个新的目录foo。 * cd foo ** 切换到当前目录下或者在变量CDPATH中列出来的目录foo。在builtins(7)查看命令cd。 * cd / ** 切换到根目录。 * cd ** 切换到用户主目录。 * cd /foo ** 切换到绝对路径/foo所指定的目录。 * cd .. ** 切换到上一级目录。 * cd ~foo ** 切换到用户主目录下的foo目录去。 * cd - ** 切换到上一次所去的目录。 * </etc/motd pager ** 使用默认的分页程序查看文件/etc/motd的内容,参照 command < foo, 第 4.3.10.9 节。 * touch junkfile ** 创建一个空文件junkfile。 * cp foo bar ** 拷贝一个已有的文件foo到新文件bar。 * rm junkfile ** 删除文件junkfile。 * rmdir bar ** 删除空目录bar。 (目录bar必须为空目录) * mv foo bar ** 把已有的文件foo重命名为bar * mv foo bar/baz ** 把已有的文件foo移动到新位置并重命名为bar/baz。目录bar必须存在。 * chmod 600 foo ** 让已经存在的文件foo其他人不能读写。(所有人都 不能执行)。 * chmod 644 foo ** 使文件foo其他的人可以读,但是不能写。(所有人 都不能执行) * chmod 755 foo ** 使文件foo其他的人能读不能写。(所有人都可以执行) * top ** 全屏显示进程信息。输入”q”退出。 * ps aux | pager ** 用BSD风格输出所有正在运行的进程的信息。参照 command1 | command2, 第 4.3.10.2 节。 * ps -ef | pager ** 用system-V风格来输出所有正在运行的进程的信息。 * ps aux | grep -e "[e]xim4*" ** 显示exim4进程,或者运行exim的进程。输入man grep可以从grep(1)的手册页学习正则表达式。 * ps axf | pager ** 用ASCCI艺术形式来显示运行所有进程信息。 * kill 1234 ** 杀死进程号为1234的进程。 查看 中止一个进程, 第 8.5.1 节。 * grep -e "pattern" *.html ** 找到当前目录下面所有以.html结尾的文件中含有"pattern"的行,并显示它们。 * gzip foo ** 用Lempel-Ziv(LZ77)压缩算法压缩foo,生成foo.gz。 * gunzip foo.gz ** 将文件foo.gz解压缩生成foo。 * bzip2 foo ** 将文件foo.bz2解压缩生成foo。 * tar -xvvf foo.tar ** 从打包文件foo.tar解出文件来。 * tar -xvvzf foo.tar.gz ** 从打包压缩的文件foo.tar.gz中解开文件。 * tar -xvvf --bzip2 foo.tar.bz2 ** 从文件foo.tar.bz2解压缩文件。 * tar -cvvf foo.tar bar/ ** 把目录bar/的内容打包存放到foo.tar存档中。 * tar -cvvzf foo.tar.gz bar/ ** 把目录bar/的内容打包并且压缩存放到foo.tar.gz存档中。 * tar -cvvf --bzip2 foo.tar.bz2 bar/ ** 把目录bar/中的内容打包存放到foo.tar.bz2存档里面。 * zcat README.gz | pager ** 实用默认的分页显示程序pager来显示压缩文件README.gz中的内容。 * zcat README.gz > foo ** 使用文件README.gz解开后的内容创建一个文件foo。 * zcat README.gz >> foo ** 把文件README.gz解开后的内容追加到文件foo的后面(如果文件不存在的话,就会创建一个)。 * find . -name pattern ** 用shell找到匹配pattern的文件名(慢一些)。 * locate -d . pattern ** 用shell找到匹配pattern的文件名(使用已有的规则的数据库,快一些)。 请用上面的这些命令来查看您的系统的目录和其他的信息,以此来熟练一些操作。如果您 对上面的这些控制台命令有任何不明白的地方,请首先阅读帮助手册,比如下面的命令就是 好的开始: <pre><nowiki> $ man man $ man bash $ man ls </nowiki></pre> 现在也是时候启动vim然后按下F1键了。您最少也应该阅读开始的35行。然后把光标移动到|tutor|,再按下Ctrl-]就可以做在线测试了。查看 编辑器, 第 11 章可以学到更多关于编辑器的知识。 请注意许多来自于GNU和BSD的类Unix命令都会在您进行如下操作的时候(或者您没有给出任何参数)给出简单的帮助: <pre><nowiki> $ commandname --help $ commandname -h </nowiki></pre> 您也可以参照 Ubuntu 小技巧, 第 8 章里的例子来进行自我测试。 ==== 命令执行 ==== 现在您已经比较了解应该如何使用 Ubuntu 系统了。让我们来更深入的了解 Ubuntu 系统的命令执行结构。 ==== 简单的命令 ==== 一个简单的命令是如下面的序列 * 可变的声明 (可选) * 命令的名字 * 参数 (可选) * 重定向 (可选: > , >> , < , << , 等等) * 控制操作 (可选: && , || ; <换新行> , ; , & , ( , ) ) 想了解更多复杂命令的解释和应用请查看 命令行处理, 第 13.2.6 节。 ==== 命令执行和环境变量 ==== 典型的使用shell来执行命令情况如下: <pre><nowiki> $ date Sun Oct 26 08:17:20 CET 2003 $ LC_ALL=fr_FR date dim oct 26 08:17:39 CET 2003 </nowiki></pre> 这里date程序是在前台执行的。环境变量LC_ALL是: * 取消设置 (系统默认的和 C)作为第一个命令 * 设置为 fr_FR (French locale) 作为第二个命令。 绝大多数的命令并没有预先定义各种环境变量。像上面的例子选择如下方式: <pre><nowiki> $ LC_ALL=fr_FR $ date dim oct 26 08:17:39 CET 2003 </nowiki></pre> 正如您所看到的,命令的输出和环境变量设置有关,上面产生的是法语输出。如果您 想这个环境变量在子进程中也能够得到继承的话(e.g.,执行shell脚本的时候),您需要 使用下面的方式。 <pre><nowiki> $ export LC_ALL </nowiki></pre> ==== 命令搜索路径 ==== 当您在shell提示符里面输入一个命令的时候,shell就会在PATH环境变量所列出的目录里面去查找。PATH环境变量的值也被叫做shell的查找目录。 在默认安装的 Debian中,用户的PATH环境变量里面也许没有包含/sbin/。因此如果您想运行一些命令比如/sbin/目录下的ifconfig,您就必须在PATH环境变量里面包含它。PATH环境变量一般是在初始化文件~/.bash_profile里面设置的,参看 Bash 设置, 第 3.2 节。 ==== 命令行选项 ==== 一些命令带有参数,参数部分以-或者--开始的被称做选项。可以用来控制命令的行为。 <pre><nowiki> $ date Mon Oct 27 23:02:09 CET 2003 $ date -R Mon, 27 Oct 2003 23:02:40 +0100 </nowiki></pre> 这里命令行参数-R改变了命令date的表现以让它输出符合RFC-2822的日期字符串。 ==== Shell 通配符 ==== 通常您需要用命令来处理一组文件,但是您又不想输出所有的文件名。shell'''通配符'''使得这个成为可能。 * * ** 这个匹配0个或者多个字符。 ** 它不会匹配以"."开始的文件名. * ? ** 这个仅匹配一个字符。 * [...] ** 这个匹配[]里面的某个字符。 * [a-z] ** 这个匹配字符a到z之间的某个字符。 * [^...] ** 这个匹配任意不包含在[]里面的字符(不包含字符"^"). 作为练习。请尝试着运行下面的命令并思考一下: <pre><nowiki> $ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt $ echo *.txt *****txt 2.txt $ echo * *****txt 2.txt 3.c 4.h $ echo *.[hc] *****c 4.h $ echo .* ***** .. .5.txt $ echo .[^.]* .5.txt $ echo [^1-3]* *****h $ cd ..; rm -rf junk </nowiki></pre> ==== 命令返回值 ==== 每个命令都返回一个值和它返回的状态。 * 返回0表示命令被正确执行 * 返回非0的值表示命令没有正确执行。 返回值可以在命令执行后马上用shell用变量$?来访问。 <pre><nowiki> $ [ 1 === 1 ] ; echo $? 0 $ [ 1 === 2 ] ; echo $? 1 </nowiki></pre> 请注意,在shell中的逻辑上下文中使用这些返回值的时候'''success'''被看做逻辑值'''TRUE'''。这个多少有一点不直观,因为'''success'''等价于值'''zero'''。 参看 Shell条件表达式, 第 13.2.5 节。 ==== 典型的命令序列 ==== 在我们阅读了这些惯用的shell命令以后,让我们试者记住它们。参看 Shell参数, 第 13.2.3 节, Shell重定向, 第 13.2.4 节, Shell条件表达式, 第 13.2.5 节,和 命令行处理, 第 13.2.6 节。 ===== command & ===== command在子shell的'''background'''运行。后台任务让多成程序能够运行在一个shell里面。 管理这些后台任务的请求需要shell内建的: jobs,fg, bg,和kill。请查看 bash(1)这一小节中的"SIGNALS","JOB CONTROL","SHELL BUILTIN COMMANDS".的相关内容。 ===== command1 | command2 ===== command1的标准输出被直接输入到 command2 的标准输入。 两个命令都可能'''并行'''地运行。这个被称作'''pipeline'''。 ===== command1 ; command2 ===== command1command2被有序的执行。 ===== command1 && command2 ===== command1如果执行成功的话那么再执行command2。只有当command1'''并且'''command2都运行成功的话上面的命令序列才会成功返回。 ===== command1 || command2 ===== command1被执行以后,如果不成功的话,command2也会被执行。当command1 '''或者'''command2有一个执行成功的话,上面的序列就会返回真值。 ===== command > foo ===== 把command的标准输出重定向到文件foo。(覆盖内容) ===== command >> foo ===== 把command的标准输出重定向到文件foo。(追加) ===== command > foo 2>&1 ===== 同时把command的标准输出和标准出错信息重定向到文件foo。 ===== command < foo ===== 把command的标准输入重定向到一个文件foo。 <pre><nowiki> $ </etc/motd pager ... (the greetings) $ pager </etc/motd ... (the greetings) $ pager /etc/motd ... (the greetings) $ cat /etc/motd | pager ... (the greetings) </nowiki></pre> 尽管上面4个方法都显示同样的内容,但是最后一个多运行了cat命令。而且不必要的浪费了资源。 ==== 命令别名 ==== 您可以给一个命令序列起一个别名。比如: <pre><nowiki> $ alias la='ls -la' </nowiki></pre> 现在, la就成了 ls -la命令的简写用来列出所有文件的详细信息。 您可以用type来显示命令的详细路径或者其他身份。比如: <pre><nowiki> $ type ls ls is hashed (/bin/ls) $ type la la is aliased to `ls -la' $ type echo echo is a shell builtin $ type file file is /usr/bin/file </nowiki></pre> 这里ls在最近被查找过了,而file没有,因此ls被"hashed",i.e.,shell有一个内部的记录可以用来快速的找到ls的地址。 === 类 Unix 文本处理 === 在类 Unix 的系统中,有几个文本处理工具经常用到。 * 非正则表达式的方法有: ** head 显示文件的开始部分。 ** tail 显示文件的结尾部分。 ** sort 给文件中的每一行排序。 ** uniq 删除文件中重复的行。 ** tr 转换或者删除字符。 ** diff 把文件中的内容一行一行的比较。 * 基本的正则表达式Basic regular expression (BRE) : ** grep 按模式匹配文本。 ** ed 一个原始的行编辑器。 ** sed 一个流编辑器。 ** vi 一个屏幕编辑器。 ** emacs 一个屏幕编辑器。 * 扩展的正则表达式Extended regular expression (ERE) is used: ** egrep 按模式匹配文本。 ** awk 进行简单的文本处理。 查看 Awk, 第 13.3 节. ** perl做非常难以想像的文本处理。 查看 Perl, 第 13.4 节. 查看 正规表达式的置换, 第 8.6.13 节, 精巧的管道命令辅助脚本, 第 8.6.18 节, and 短小的Perl脚本, 第 8.6.20 节 可以找到一些脚本的例子。 ==== 正则表达式 ==== 正则表达式用在很多文本处理工具里面。它们和shell的通配符比较相似(查看 Shell 通配符, 第 4.3.8 节),但是它们更复杂也更强大。 正则表达式是由文本字符和'''元字符'''组成的,用来描述匹配模式。元字符是有特殊意义的字符。它们有两种主要的形式BRE和ERE,主要取决于 类 Unix 文本处理, 第 4.4 节里面是如何描述的。 在扩展的正则表达式(EREs)里面'''元字符'''包括"\ . [ ] ^ $ * + ? ( ) { } |"。正则表达式表示: * c ** 这个用来匹配非元字符 "c". * \c ** 这个用来匹配原本的字符"c". * . ** 这个用来匹配任意字符包括换行符。 * ^ ** 这个用来匹配字符串的开始。 * $ ** 这个用来匹配字符串的结尾。 * \< ** 这个用来匹配一个单词的开始。 * \> ** 这个用来匹配一个单词的结尾。 * [abc...] ** 这个字符序列用来匹配 "abc..."中的任意字符。 * [^abc...] ** 这个否定的字符序列匹配所有的字符除了 "abc...". * r* ** 这个匹配以"r" 开始的后面有0个或者多个字符的字符串。 * r+ ** 这个匹配以"r" 开始的后面有一个或者多个字符的表达式。 * r? ** 以"r" 开始后面有0个或者1个其他的字符。 * r1|r2 ** 匹配"r1"或者"r2"。 * (r1|r2) ** 匹配"r1"或者 "r2"并且把它当作一个'''分类''' 正则表达式。 在BREs里面'''元字符'''"+ ? ( ) { } |"不再具有它们特殊的含义,而是使用的有反斜杠的版本"\+ \? \( \) \{ \} \|"。因此分组(r1|r2)需要被表示成\(r1|r2\)。 因为emacs,虽然基本上是BRE,但是它把"+ ?"当作元字符。因此不需要特别表示它们。查看 替换表达式, 第 4.4.2 节来了解构造分组是如何使用的。 举个例子,grep 可以用正则表达式来搜索文本: <pre><nowiki> $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program </nowiki></pre> ==== 替换表达式 ==== 在替换表达式里面,下面的字符有特殊的含义: * & ** 这个会替换正则表达式所匹配的部分。(在emacs里面用\&) * \n ** 这个会替换n-th'''括号'''正则表达式所匹配的内容。 在Perl里面,$n替换了\n,&也没有特殊的含义。 举个例子: <pre><nowiki> $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&= </nowiki></pre> 请特别注意这些'''括号'''正则表达式的格式,以及这些被匹配的文本在文本处理工具里面是如何使用的。 这些正则表达式可以用来控制光标的运动和编辑器里面的文本替换。 请阅读所有相关手册来学习这些命令。 === 类 Unix 文件系统 === 在 GNU/Linux和其他的类Unix操作系统里面'''文件'''都被放在'''目录'''。 所有的'''文件'''和'''目录'''都被排列在一棵很大的树里面, 即文件层次树,他的根是/。 这些文件和目录可以跨多个设备。mount(8)命令可以把一些设备挂载到文件系统树里面来。反之umount(8)可以把设备卸载。 ==== Unix 文件基础 ==== 这里是一些最基础的: * 文件名是区分大小写的,MYFILE和文件MyFile是'''不同'''的文件。 * 根目录指的是/不要把这个”root”和root用户相混淆了。参看 用超级用户登录到命令提示符, 第 4.1.1 节。 * 任何目录都有一个可以由任意字母或者符号组成的名字,但是/是'''例外'''。 [[http://qref.sourceforge.net/quick/footnotes.zh-cn.html#f31 31]] 根目录是一个例外:它的名字是/(读做”slash"或者根目录)它不能被重命名。 * 任何一个目录都是有下面几种形式给出的,'''完全限制的文件名''','''绝对文件名''',或者'''路径''',给出所有需要经过的目录序列。这三种形式是等价的。所有的绝对文件名都以/目录开始,在目录和目录或者目录和文件之间用/隔开。最开始的/是一个目录的名字,但是后面的仅仅是文件名的分隔符。 上面的这些话看起来让人很费解。那么看看下面的例子吧: <pre><nowiki> /usr/share/keytables/us.map.gz </nowiki></pre> 这就是一个完整限制的文件名;有些人把它叫做'''路径'''。然而人们经常 单独把us.map.gz 作为文件名。 * 根目录有很多分支,比如/etc/和/usr/。这些子目录 又分出很多子目录来,比如 /etc/init.d/和/usr/local/。 所有的加起来被称作'''目录树'''。 您可以想像,一个绝对文件名就是从树的根基(/)到一个分支的末端(文件)的路由。您也会听到别人把目录树叫做'''家庭'''树:这样子目录就有 '''双亲''',路径就显示了所有文件完整的血缘关系。 除此之外,还有相对路径,它从其它的地方开始而不是根目录。您可能还记得 ../指的是上一级目录。 * 没有哪一个目录是和物理设备紧密关联的,比如您的磁盘。这个和DOS,CP/M,Windows系统不一样的,它们所有的路径都是以一个设备名开始的,比如C:\,参看 Ubuntu 中的文件系统概念, 第 4.5.2 节。 关于文件层次的详细信息以及最好的操作练习可以在这里找到[http://qref.sourceforge.net/usr/share/doc/debian-policy/fhs/fhs.txt.gz Filesystem Hierarchy Standard]。作为一个初学者,您需要记住下面的事实: * / ** 简单的一个/表示根目录。 * /etc/ ** 这个是大多数系统配置文件存放的地方。 * /var/log/ ** 这个是系统日志存放的地方。 * /home/ ** 这个目录是存放所有非特权用户的主目录的。 ==== Ubuntu 中的文件系统概念 ==== 按照Unix的传统, Ubuntu为存放物理数据的磁盘或者其它存储设备,还有这些硬件设备之间的交互提供文件系统,比如控制台屏幕和远程串行终端就用联合的方式表示。 每个在Ubuntu系统上的文件,目录,命名管道,或者物理设备都有一个数据结构被称作 '''inode''',它被用来描述设备用用的属性,比如设备所有者,所属于的组, 上次访问时间等等。参看[http://qref.sourceforge.net/usr/include/linux/fs.h /usr/include/linux/fs.h]来获得struct inode在 Debian GNU/Linux系统中的详细信息。 这些表现出来的统一的物理入口是非常强大的,因为它们使得可以使用同样的命令和同样 的操作来访问完全不同的设备。 您所有的文件都可以在一个次方上面,----或者您有20个磁盘,有些是在网络上其它的计算机上面, 在GNU/Linux系统中每个文件和目录都与其拥有者(主人)和拥有组相关联。所有的文件信息都保存在一个称为'''inode'''的数据结构中。 ==== 文件和目录的访问权限 ==== 文件和目录的访问权限对如下3类用户进行了分别定义: * 文件'''拥有者'''(u), * 文件拥有者所在'''用户组'''中的其它成员(g),和 * 所有'''其它'''用户(o)。 每个文件均拥有下列三种权限: * '''read''' (r): 查看文件内容 * '''write''' (w): 修改文件 * '''execute''' (x): 如同命令一样执行文件 每个目录均拥有下列三种权限: * '''read''' (r): 列出目录内容 * '''write''' (w): 在目录中增删文件 * '''execute''' (x): 访问目录中的文件 在此,对目录的'''execute'''权限,不仅意味着允许查看目录下文件的内容,还允许查看文件的其它信息如文件大小、修改时间。 ls可用来显示目录和文件的这些信息。参阅 ls(1)。使用ls的-l选项,就会按如下顺序显示下列信息: * '''文件类型'''(第1个字符) ** -: 普通文件 ** d: 目录 ** l: 符号链接 ** c: 字符型设备节点 ** b: 块设备节点 ** p: 命名管道 ** s: 套接字 * 文件访问'''权限'''(接下来的9个字符,每3个一组依次代表user、group和other)。 * 文件的'''硬链接数''' * 文件拥有'''user'''的用户名 * 文件所属'''group'''的用户组名 * 文件的字符数'''大小''' (bytes) * 文件的'''时间和日期''' (mtime) * 文件的'''名称''' 在root账号下可使用chown改变文件的拥有者。要改变文件的所属组,可以文件拥有者或root的身份运行chgrp。要改变目录的访问权限,可以文件拥有者或root的身份运行chmod。 <pre><nowiki> # chown newowner foo # chgrp newgroup foo # chmod [ugoa][+-=][rwx][,...] foo </nowiki></pre> 细节请参见 chown(1)、 chgrp(1) 和 chmod(1)。 例如,可以root帐号下创建一个目录树,并使其拥有者为foo,所属组为bar: <pre><nowiki> # cd /some/location/ # chown -R foo:bar . # chmod -R ug+rwX,o=rX . </nowiki></pre> 下面是3个更特殊的权限: * '''set user ID''' (s 或 S 代替 user's x), * '''set group ID''' (s 或 S 代替 group's x), * '''sticky bit''' (t 或 T 代替 other's x). 在此,如果隐藏在特殊权限后面的执行权限标位没有设置,则ls -l的输出中,这些标识位将使用大写字母。 为可执行文件设置'''set user ID'''位将允许用户以该文件拥有者的ID来执行该文件(例如以'''root'''身份)。同样,为可执行文件设置'''set group ID'''将允许用户以该文件所属组的ID来执行该文件(例如以'''root'''身份)。因为这些设置将引起安全风险,所以使用这些特性时要格外小心。 为目录设置'''set group ID''',则该目录会使用BSD-like文件创建方案,即目录中所有新创建的文件均属于该目录所属的'''group'''。 为目录设置'''sticky bit'''可防止非文件拥有者移动目录中的文件。为确保全局可写目录如/tmp或组可写目录中的文件内容不被修改,不仅要关闭文件的'''写'''权限,还应设置目录的'''sticky bit''',否则,任何对该目录有写权限的用户均可以将该文件移动到别处,然后在原地创建一个同名文件。 这儿有一些有关文件权限的有趣例子。 <pre><nowiki> $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/pppd crw-rw---- 1 root dip 108, 0 Jan 18 13:32 /dev/ppp -rw-r--r-- 1 root root 1051 Jan 26 08:29 /etc/passwd -rw-r----- 1 root shadow 746 Jan 26 08:29 /etc/shadow -rwsr-xr-- 1 root dip 234504 Nov 24 03:58 /usr/sbin/pppd $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 4 root root 4096 Feb 9 16:35 /tmp drwxrwsr-x 10 root staff 4096 Jan 18 13:31 /usr/local drwxrwsr-x 3 root src 4096 Jan 19 08:36 /usr/src drwxrwsr-x 2 root mail 4096 Feb 2 22:19 /var/mail drwxrwxrwt 3 root root 4096 Jan 25 02:48 /var/tmp </nowiki></pre> 在 chmod(1) 命令里,有一种替代的数字模式来描述文件权限。这种数字模式使用 3 到 4 个八进制数字(以8为基)。 每个数字相应如下: * 第一个可选数字: '''set user ID''' (=4)、 '''set group ID''' (=2) 和 '''sticky bit''' (=1)之和 * 第二个数字: '''user''' 的 '''read''' (=4)、'''write''' (=2) 和 '''execute''' (=1) 权限之和 * 第三个数字: 同上,用于 '''group''' * 第四个数字: 同上,用于 '''other''' 这听起来复杂,但实际上相当简单。 从 ls -l 命令的输出中,看第(2-10)列,把它们作为二进制(以2为基)文件权限(“-”表示“0”,“rwx” 表示“1”)的表示方式来读, 这种数字模式值将使你理解八进制(以8为基)的文件权限表示。 例如,尝试: <pre><nowiki> $ touch foo bar $ chmod u=rw,go=r foo $ chmod 644 bar $ ls -l foo bar -rw-r--r-- 1 penguin penguin 0 Nov 3 23:30 foo -rw-r--r-- 1 penguin penguin 0 Nov 3 23:30 bar </nowiki></pre> 默认的文件权限掩码使用 shell 内建命令 umask 设置。 参见 builtins(7)。 ==== 时间戳 ==== GNU/Linux的文件有3种类型的时间戳: * '''mtime''': 修改时间 (ls -l), * '''ctime''': 状态改变时间 (ls -lc),以及 * '''atime''': 最近访问时间 (ls -lu). 注意'''ctime'''并非文件创建时间。 * 覆盖一个文件会改变所有三类时间'''mtime'''、'''ctime'''和'''atime'''所有三类时间。 * 改变文件的访问权限或拥有者会改变文件的'''ctime'''和'''atime'''。 * 读文件会改变文件的'''atime'''。 注意,在 Debian 系统中,即便是简单的读文件通常会引起文件的写操作,从而更新'''inode'''上的'''atime'''信息。使用noatime选项来挂载文件系统,可使用系统忽略该操作,从而加速文件的访问和读取。参阅mount(8)。 使用 touch(1) 命令来改变存在文件的时间戳。 ==== 链接 ==== 在2种方法将文件foo关联到不同的文件名bar。 * '''hardlink'''(硬链接)相当于现存文件的另一个名字。(ln foo bar), * '''symbolic link'''(符号链接),或者“symlink”,是通过名字指向另外一个文件的特殊文件。(ln -s foo bar)。 下面的例子显示了链接数的改变和使用rm命令时产生的微妙差异。 <pre><nowiki> $ echo "Original Content" > foo $ ls -l foo -rw-r--r-- 1 osamu osamu 4 Feb 9 22:26 foo $ ln foo bar # 硬链接 $ ln -s foo baz # 符号链接 $ ls -l foo bar baz -rw-r--r-- 2 osamu osamu 4 Feb 9 22:26 bar lrwxrwxrwx 1 osamu osamu 3 Feb 9 22:28 baz -> foo -rw-r--r-- 2 osamu osamu 4 Feb 9 22:26 foo $ rm foo $ echo "New Content" > foo $ cat bar Original Content $ cat baz New Content </nowiki></pre> 上例中符号链接均拥有名义上的文件访问权限“rwxrwxrwx”,它们的有效访问权限均由它们所指向的文件来定义。 * 链接到它所属的目录,因此任何新目录的链接数都从2开始计算。.. 链接到父目录,因些目录链接数会随新的子目录数的增长而增长。 ==== 命名管道(FIFOs) ==== 命名管道是一个行为象一个管道的文件。把某些东西放入命名管道文件,它从另外的一端出来。因此,它被称为 FIFO,或 First-In-First-Out:首先放入管道的东西将首先从另外一端出来。 如果写东西到一个命名管道,在写的东西在管道被读出之前,写的进程不会中止。如果从一个命名管道读,读的进程在中止之前,一直处于等待状态,直到有东西可以读为止。命名管道的大小始终为零 --- 它不储存数据,象 shell | 一样,它仅仅连接两个进程。然而, 这个管道有一个名字,两个进程没有必要在同一个命令行运行,或者由同一个用户运行。 做下面的操作来尝试: <pre><nowiki> $ cd; mkfifo mypipe $ echo "hello" >mypipe & # 放入后台 [1] 5952 $ ls -l mypipe prw-r--r-- 1 penguin penguin 0 2003-11-06 23:18 mypipe $ cat mypipe hello [1]+ Done echo hello >mypipe $ ls mypipe prw-r--r-- 1 penguin penguin 0 2003-11-06 23:20 mypipe $ rm mypipe </nowiki></pre> ==== 套接字 ==== 套接字类似于命名管道(FIFO),它允许进程交换信息。 对于套接字,那些进程不必要在同时运行,也没有必要是同一个祖先进程的子进程。 它是进程间通讯的端点。 信息交换可以通过网络发生在不同的主机之间。 ==== 设备文件 ==== 设备文件是系统上物理的或者虚拟的设备,比如说硬盘、显卡、显示器或者键盘。 一个虚拟设备的例子是控制台,由 /dev/console 表示。 有两种类型的设备: * '''字符设备''' ** 一次能够访问一个字符,那就是说,从设备读或者写的最小的数据单元是一个字符(byte)。 * '''块设备''' ** 一定是访问一个叫块的大单元,它含有许多字符。 硬盘是一个块设备。 设备文件可以被读写,尽管设备文件包含二进制数据,而这些二进制数据对人类来说是费解的乱码。 向设备文件直接写数据,有时侯对解决硬件连接故障有用。 比如说,将一个文本文件导出到打印机设备 /dev/lp0, 或者发送调制解调器命令到一个适当的串口 /dev/ttyS0。 但是,除非是慎重的操作,它有可能造成一个大的破坏。 所以请小心。 ===== /dev/null 等等 ===== /dev/null 是一个特殊的设备文件,它忽略写给它的任何东西。 如果不需要某些东西,把它扔到 /dev/null。 它本质上是一个无底洞。 如果从 /dev/null 读东西,将会立即得到文件结束符(EOF)。 /dev/zero 是类似的,只是从它读的话,将会得到 \0 字符(不与数字零的 ASCII 码相同)。 参阅 空文件, 第 8.6.34 节。 ===== 设备号 ===== 按例子执行 ls,将显示设备号。 <pre><nowiki> $ ls -l /dev/hda /dev/ttyS0 /dev/zero brw-rw---- 1 root disk 3, 0 Mar 14 2002 /dev/hda crw-rw---- 1 root dialout 4, 64 Nov 15 09:51 /dev/ttyS0 crw-rw-rw- 1 root root 1, 5 Aug 31 03:03 /dev/zero </nowiki></pre> 在这里: * /dev/hda 主设备号为 3,次设备号为 0。 属于 disk 组的用户有读写访问权。 * /dev/ttyS0 主设备号为 4,次设备号为 64。 属于 dialout 组的用户有读写访问权。 * /dev/zero 主设备号为 1,次设备号为 5。 所有人都有读写访问权。 在老的系统中,安装过程使用 /sbin/MAKEDEV 命令来创建设备号。 参阅 MAKEDEV(8)。 在新的系统中, /dev 下的文件系统通过设备文件系统自动生成, 设备文件系统与 /proc 文件系统类似。 ==== /proc 文件系统 ==== /proc 文件系统是一个伪文件系统,它包含系统信息和正在运行的进程信息。 当注意到一个特殊的文件 /proc/kcore 时,人们经常恐慌,因为它通常很巨大。 该文件(或多或少)是计算机内存的一个拷贝。 它被用来调试内核, 实际上它并不存在,所以不必担心它的大小。 参阅 通过 proc 文件系统调整内核, 第 7.3 节 和 proc(5)。 === X 窗口系统 === 参阅 X, 第 9.4 节。 ==== 启动 X 窗口系统 ==== X 窗口系统能够使用类似 xdm 的图形登录守护启动,或者在控制台下输入如下的命令启动: <pre><nowiki> $ exec startx </nowiki></pre> ==== X 窗口系统下的菜单 ==== X 环境能够与许多窗口管理器协作,各个窗口管理器的用户界面有很大不同。 请记住,右击根窗口将显示一个选择菜单。这个功能总是存在。 * 得到 shell 命令提示符,从菜单启动 Xterm : ** "XShells" --> "XTerm". * 浏览有图形的网页,从菜单启动 Mozilla: ** "Apps" --> "Net" --> "Mozilla Navigator". * 浏览有图形的 PDF 文件,从菜单启动 Xpdf: ** "Apps" --> "Viewers" --> "Xpdf". 如果没有发现菜单条目,请安装适当的软件包。参阅 Ubuntu 软件包管理基础, 第 6.2 节。 ==== X 窗口系统键盘序列 ==== 当运行 X 窗口系统时,下面是一些需要记住的重要键盘序列。 * Ctrl-Alt-F1 到 F6: 切换到其它伪终端(从 X 系统、DOSEMU等。) * Alt-F7: 切换回 X 窗口 * Ctrl-Alt-minus: 改变 X 窗口的屏幕解析度(减号为数字键盘的键) * Ctrl-Alt-plus: 在 X 窗口内以相反的方向改变屏幕解析度(加号为数字键盘的键) * Ctrl-Alt-Backspace: 中止 X 服务器程序 * Alt-X, Alt-C, Alt-V: 通常在 Windows/Mac 下与 Ctrl- 键联合的粘贴、拷贝和剪切键,在 Netscape Composer 等程序中,使用 Alt- 键代替。 === 进一步学习 === 目前,推荐阅读来自 [http://www.tldp.org/guides.html The Linux Documentation Project: Guides] 的关键用户手册。 * "The Linux System Administrators' Guide", ** 覆盖了系统运行、处理用户账号、备份和配置系统的各个方面的内容。 ** 软件包: sysadmin-guide ** 文件: [http://qref.sourceforge.net/usr/share/doc/sysadmin-guide/html/index.html /usr/share/doc/sysadmin-guide/html/index.html] ** 网址: http://www.tldp.org/LDP/sag/index.html * "The Linux Network Administrator's Guide, Second Edition", ** 在 Linux 环境下网络管理的简单参考 ** 软件包: (not available) ** 文件:[http://qref.sourceforge.net/quick/(not%20applicable) (not applicable)] ** 网址:http://www.tldp.org/LDP/nag2/index.html * "Linux: Rute User's Tutorial and Exposition" ** 覆盖 GNU/Linux 系统管理的精装书(有在线版) ** 作者:Paul Sheer ** 出版:Prentice Hall ** 软件包:rutebook (从 non-free) ** 文件: /usr/share/doc/rutebook/ 更多资源参阅 Ubuntu 技术支持, 第 15 章。 [[Category:Ubuntu_参考手册]]
该页面使用的模板:
模板:UbuntuManual
(
查看源代码
)
返回至
UbuntuManual:Ubuntu指南
。