查看“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* ** 这个匹配0个或者多个r组成的字符串。 * r+ ** 这个匹配一个或者多个r组成的字符串。 * r? ** 这个匹配零个或者一个r。 * 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指南
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息