Ubuntu教程 -- 享受命令行(转贴)

原文来自:http://forum.ubuntu.org.cn/about18740.html,作者:kardinal

Shell、Console、Terminal
========================
在前面的章节中,我们曾提到,电视机的遥控器,也是一种人机交互的界面,算是一种Shell。
但是这个概念并不准确,遥控器只是向Shell发送指令的工具,Shell接收到遥控器发出指令后,将指令转换为系统命令,由系统来执行。
例如我们按的遥控器上的“数字键1”,遥控器将“切换为1频道”的指令发送到Shell,Shell将指令转换为系统可以识别的“频道1”,系统执行它,您就可以观看1频道的电视节目了。

通常每台电视机只有一种Shell,比如有的电视机系统具有“画中画”的功能,那么Shell中便有相应的功能定义,您可以通过遥控器上的“画中画”功能键来开启它。假设您的电视机没有此功能,Shell中也就没有相应的功能定义。拥有一个带“画中画”功能控制键的遥控器,即便信号兼容,您还是不能够使用这一功能:)
不用遥控器也可以控制电视机,假设您的遥控器丢了,您还可以走到电视机前,使用机身上的控制面板来控制它(相当于使用Linux的控制台)。但是您一定不喜欢这种方式,除非您想锻炼身体:)
在Linux系统中,由于图形界面和控制台的分辨率通常不一致,所以切换时要有一个延时。对于我们中文用户来讲,控制台下中文的显示也比较麻烦。而且控制台显示内容通常不如终端显示的全面。
所以我们推荐您使用终端来执行命令,它使用起来感觉很像遥控器:)

rxvt-unicode
============
通常情况下,您买一台电视机,只能获得一个遥控器。虽然它为您的电视机量身定作,能够发挥电视机的所有能力,但是您却不一定喜欢它。说不定这个遥控器体形太大,持握不方便;或者它体形太小,容易失踪;又或者它的按键要么太硬,要么太软;它的键盘要么太大,要么太小……
您一般也可以容忍,毕竟遥控器使用频率并不算高:)
如果您的终端有些地方不讨您喜欢,比如说响应太慢,或者不能正常显示中文……那就难以忍受了,您应该换一个其它的试试。

在前面的章节,我们介绍您使用的终端为Gnome-Termianl,它是系统默认使用的终端,显示中文不错,不过响应比较慢,您可能已经处于水深火热之中了。。。
我们推荐您使用urxvt(mlterm也是不错的选择)

您可以使用“sudo apt-get install rxvt-unicode”命令来安装它。
urxvt 启动它 (urxvt不支持控制台,您得在图形界面下启动它。终端、Alt+F2,建议您在启动栏里新建一个启动图标)

rxvt-unicode还支持“服务器/客户端”的运行模式:
urxvtd 启动一个守护进程daemon(支持控制台)
urxvtc 启动客户端client。多个客户端可以同时连接到一个urxvtd,以达到节省系统资源的目的。

或许您对rxvt的默认设置不满意,您可以修改用户配置文件 “~/.Xresources”来设定它。修改全局配置文件“/etc/X11/Xresources/Xresources”,则对所有用户生效,只有root才可以修改此文件。
这里有一些简单的选项:(以“!”起始的行是注释,您可以直接拷贝此文件的内容)
!!=============================================================================
!! RXVT-unicode setting
!!=============================================================================
!设置字体分辨率
Xft.dpi:96
!窗口大小
Rxvt.geometry: 80x40+80+80
!颜色
Rxvt.background:#333333
Rxvt.foreground:antiquewhite
Rxvt.inheritPixmap:False
Rxvt.colorBD:yellow
Rxvt.colorUL:antiquewhite
!滚动条
Rxvt.scrollBar:True
Rxvt.scrollBar_left:True
Rxvt.scrollBar_floating:False
Rxvt.scrollstyle:next
Rxvt.scrollColor:#999999
!屏幕缓冲
Rxvt.saveLines:30000
Rxvt.color12:DodgerBlue
Rxvt.font:7x14,xft:AR PL New Sung
!输入法一般设置为xim
!inputMethod:xim;Scim除外
!输入法样式可选:Root(置底) OverTheSpot(跟随) OffTheSpot OnTheSpot,后两种不是所有的都支持
Rxvt.preeditType:Root

Tips:右键点击启动栏,“添加自启动器”,“自定义程序”,便可以在添加自己的启动图标。

在线帮助系统
------------
您可以使用命令“man”或者“info”来阅读Linux命令的在线文档。命令的格式非常简单:
man xxx
大部分命令手册为英文版,如果您的英文不太好,或许有些困难。在后面的“系统管理”章节中,我们会尽力向您介绍命令的使用方法。

Tips:在使用“man”浏览器的时候,一些快捷键您可能会用到:
Ctrl+f(orward) 向下翻一页 Ctrl+d(own) 向下翻半页
Ctrl+b(ackward) 向上翻一页 Ctrl+u(p) 向上翻半页
/ 查找 q(uit) 退出

以上为VI风格的键绑定。您也可以使用Emacs风格的键绑定,我们马上为您介绍

bash
====
好了,现在我们换了一个遥控器,感觉顺手多了。现在来操练一下,下载一首mp3:
我们使用《wget》这个程序,它非常可靠,完全值得您信赖。
首先找到一个可以下载的地址,复制链接,在终端窗口内点击鼠标中键,把它粘贴进去。
现在终端中大概是这种情形:
http://www.download.net/xxx.mp3

按下“Ctrl+a”组合键,我们发现光标移动到了行首。输入“wget”和空格
wget http://www.download.net/xxx.mp3

回车后,终端中出现一些信息,不一会儿工夫,mp3便下载完成。

使用“Ctrl+a”组合键,我们就不需要使用方向键来移动光标,方向键每次只能移动一个字符,真是非常麻烦。
您还可以使用“Ctrl+f”向前移动光标,“Ctrl+b”向后移动光标,“Ctrl+e”将光标移动到行末………………

Tips:Linux的图形界面中,鼠标中键通常执行“粘贴”的操作,如果您的鼠标没有中键,您可以左右键同时按下。

中止正在运行的程序
------------------
如果一个命令的待续时间很长,以致于您不能够在当前Shell中继续其它操作,您可以使用“Ctrl+c”来强行中止它。

Ctrl+s
------
出于意外,有时您可能会按下“Ctrl+s”这个组合键。这时Shell会被冻结,请尝试使用“Ctrl+q”组合键,看能否恢复正常。

键绑定
------
等等,有必要记这么多快捷键么?都这么复杂!
我们建议您还是记住它们,可以大幅度的提高您操作的效率。因为这是readline控件键绑定,在使用readline控件的任何程序中,您都可以使用它们。例如bash、lftp、gdb等程序;同时,Linux下最著名的Emacs编辑器,也是这种风格的键绑定(其实是readline使用了 Emacs风格的键绑定才对),甚至FireFox中,也可以使用类似风格的快捷键!(Linux下主要有两种风格的键绑定,一种是VI风格,另一种是 Emacs风格,我们会在后面的章节中向您介绍)

现在我把ReadLine的键绑定为您列举出来,您可以自行尝试。(运行“man readline”命令,来查看ReadLine手册)
我们先来了解一些约定:
\C-a 表示 Ctrl+a
\M-a 表示 Meta+a Meta键在PC中通常为ALT键
A 表示 Shift+a
(括号中的\A代表Alt,\S代表Shift)
移动命令:
\C-a 移动到行首 Aheah
\C-e 移动到行末 End
\C-f 向前移动一个字符 Forward
\C-b 向后移动一个字符 Backward
\M-f 向前移动一个单词
\M-b 向后移动一个单词
\C-l 清空屏幕 cLear
这两个命令您也可以理解为移动命令
\C-p 上翻,前一条命令 Previous
\C-n 下翻,后一条命令 Next
编辑命令:
\C-d 删除光标后的一个字符 \M-d 删除光标后的一个单词 Delete
\BackSpace 删除光标前的一个字符 \M-BackSpace 删除光标前的一个单词
\C-k 删除光标至行末的部分 Kill
\C-u 删除光标至行首的部分 Unix-line-discard
\C-w 删除光标前的一个单词 Word
\C-y 粘贴(最后删除的对象) Yank
\C-- 撤消
搜索历史纪录:
\C-r 连续使用“C-r”可以查找下一个
\M-p
\M-n
补全:
\Tab 使用频率最高的功能!
\C-o 遍历补全,默认没有这个键绑定,我们稍后设置它。
\M-? M-= 列出所有可能选项,相当于按两次Tab键(M-? 实际按键为\A+\S+/)
\M-# 注释掉当前命令,用于将当前命令暂存于历史纪录列表(\A+\S+3)
\M-! 补全命令,通常用来补全子命令,例如“sudo”的子命令(\A+\S+1)
\M-~ 补全用户名(\A+\S+`)
\M-@ 补全主机名(\A+\S+2)
\M-$ 补全变量(\A+\S+4)
\M-_ 补全历史纪录中的纪录(\A+\S+-)
\M-* 将所有可能选项放到命令行中(\A+\S+8)

非增量查找 (待续)

自定义键绑定
----------
我们可以通过修改“/etc/inputrc”文件来改变键绑定,不过我们建议您还是使用默认的键绑定,以免带来不必要的烦恼。当然了,Emacs风格的键绑定是非常通用的,您随时都有可能用到。

在文件中添加该行,可以将ReadLine的键绑定设为VI风格。(Bash、Lftp等使用ReadLine的软件同时生效)
set editing-mode vi

找到这一行:
$if mode=emacs
在它的下面添加该行
"^O": menu-complete
重新登录Shell,您就可以使用\C-o(Ctrl+o)来遍历补全。假如您的文件名为中文,或者出现乱码时,您可以使用\M-*将所有文件名放入命令行,再删除多余的,这真是麻烦极了!所以您可以使用\C-o遍历补全,将所有可能的选项轮流放入命令行。

通配符
------
使用“?”代表任意单个字符。例如“???lo”,表示“lo”前有三个字符,它可以匹配“Hello”
使用“*”代表随意几个任意字符。例如“*.iso”,代表所有iso格式的文件。

Tips:您可以将遍历补全和通配符结合使用,以提高效率。
例如:
cd */ 则遍历补全只补全文件夹
chmview *.chm 则遍历补全只补全chm文件

进程管理
--------
在命令的末尾加上一个“&”符号,表示在后台执行该命令,例如:
wget http://www.download.net/xxx/mp3 &
如果使用“;”将多个命令连结起来,则表示命令按先后顺序执行命令
如果使用“&&”将多个命令连结起来,则表示只有前面的命令执行成功,后面的命令才能得以执行

`command`,如果一个命令中包含以“`”(Esc键下方的按键)包围的命令,那么这部分命令将被优先执行,执行结果被代入上一级命令继续执行,例如创建一个以当前时间命名的文件:
touch `date +%m.%d_%H:%M:%S`
“touch”命令能够创建一个文件,它的操作对象,为“date +%m%d%H%M%S”命令的输出“06.06_06:06:60”
这样,我们创建了一个名为“06.06_06:06:60”的文件(六月六日六时六分刚过六十秒-_-!)

当一个进程已经在前台执行,您可以使用“Ctrl+z”将它丢入后台
不过这个时候进程的状态为
[1]+ Stopped xxx
您可以使用“bg”命令使它在后台继续运行。这时它的状态为
[1]+ xxx &
使用“fg”命令,就可以把一个后台的命令取回前台运行

方括号中的数字为命令的任务编号,您可以使用“jobs”命令来查看所有后台运行的命令
如果后台运行多个命令,您可以在“bg”或者“fg”后跟任务编号,作为操作对象,例如:
bg 2

管道、重定向
------------
“>”为重定向符号,它的作用是将命令的输出重定向到一个文件中。比如我们想把命令“ls”的结果保存为“FileList”文件,作一个清单,我们可以使用重定向符号来完成它:
ls -l > FileList
“>>”作为与“>”基本相同,不同点在于,“>>”以追加的方式,将命令的输出写入文件的末尾。

“<”是从文件到命令的重定向,将文件的内容作为命令的输入。

“|”为管道符号,它的作用是将前一个命令的输出,作为下一个命令的输入。假设一个目录下的文件太多,使用“ls”命令不能够在屏幕中完全显示,这个时候您可以将“ls”命令的输出,通过管道符号,作为浏览器“less”的输入。就可以使用浏览器的功能翻页、查找:
ls -al | less

Tips:“less”浏览器的键绑定几乎与“man”相同,请参阅上面“在线帮助系统”的介绍

脱字符
------
Shell中的一些功能是通过特殊符号作为控制字符来实现的,上面已经介绍了很多了。这就有一个问题,如果一个文件名中,刚好包含了这些字符,比如“;”,我们就很难对它进行操作。使用“less”浏览这个文件
less ;xxx
“less”会很快返回一个错误信息,因为并没有一个文件名作为操作对象。接着,Shell会报告您,系统中没有“xxx”这个命令。
这是因为Shell将文件名中的“;”解析为顺序执行命令。
或者您的文件名以空白起始,而在Shell中,无论多少个空格,都将被解析为一个分隔符。您甚至不是使用命令重命名此文件。

这个时候您就要用到脱字符“\”了,它能够将一个具有特殊涵义的字符转换普通字符。上面的两个任务,您可以在文件名中每个特殊字符前加一个“\”,像这样
less \;xxx
less \ \xxx
less \;\ \&\xxx

Tips:也可以使用“"”将文件名包围起来,例如“less "; &xxx"”,在很多情况下,这甚至更方便一些。

脱字符在Shell中也可以作为换行符,在一个命令的末尾添加一个“\”,然后回车,继续输入命令剩余的部分,可以将一个命令拆分为多行且不影响它的执行(如果执行一个很长的命令,请将它拆分为多行以便于阅读)
事实上换行符也符合脱字符的定义。回车键有两个涵义,一个是“执行”(Enter),另一个“换行”(折线箭头)。在Shell中它作为控制字符“执行”,使用脱字符后,它便代表排版字符“换行”了。

Fish
====
the friendly interactive shell
正如它的名字,Fish是一款非常友好的Shell,大力推荐!您可以使用命令“sudo apt-get install fish”来安装它。安装完成后,运行命令“fish”切换到fish,“exit”返回bash。

我来简单介绍一下它的优点:

1、自动补全、语法高亮
bash的自动补全默认只是补全命令、路径,如果想补全变量、参数等,通常需要使用复杂的组合键(见上面bash的介绍),即便您能够记住它们,快速准确的按下这些组合键,也是一种严峻的考验。而FISH的自动补全可以自动识别语法,补全正确的内容。并且具有语法高亮的功能,比如用MPLAYER放 MP3:
mpl(ayer) -l(oop) (0) -sh(uffle) -pl(aylist) (mp3_playlist)
一阵猛按键,一个蛮长的命令就完成了。
而且补全结果不唯一时给出的提示中含有简短的说明,这样通常也不用看帮助了:)比如:
mplayer -l后,自动将参数补全为 -lo 然后给出提示
-{lo}adidx (Load index from file) -{lo}op (Loop playback) {花括号中为青色文字}
它的语法高亮功能十分有用,如果你输入的命令是正确的,则用青色显示,正确的参数用白色显示,错误的则一律用红色。

2、方便的历史纪录搜索
还是上面的那个命令
mplayer -loop 0 -shuffle -playlist mp3_playlist
你可以用上翻配合下翻浏览命令历史,直到找到这个命令,当然那样太慢了。
你还可以输入以上命令中的某一部分,如“uffle”只要翻一次就可以找到了
(还可以META+上翻在已输入部分中插入某一历史单词)

3、文件夹历史纪录
dirh (dir history)就可以显示当前会话中进入的文件夹纪录
使用“prevd”和“nextd”跳转
假如你分别进入过1 2 3 4 5 这几个文件夹,"prevd 4 "可以让你在 5 中直接跳到 1

其它的功能,fish基本是兼容bash的。键绑定也非常的相似,少数的键绑定不尽一致,例如:
\C-h 删除光标前的一个字符(bash为退格键,不方便)

您可以修改“/etc/fish_inputrc”这个文件,增加以下行:
"\C-n": history-search-forward
"\C-p": history-search-backward
现在使用Ctrl+p上翻,使用Ctrl+n下翻。如果您已经在命令行中输入字符,那么Ctrl+p就是在历史纪录向上查找您输入的字符,Ctrl+n为向下查找,非常的方便。

设定您的默认Shell
=================
如果您能够拥有root权限,您可以直接修改“/etc/passwd”文件。找到您用户ID起始的行
user:x:1000:112:user,,,:/home/user:/bin/bash
最后一个“:”后为您登录的默认Shell,“/bin/bash”是您的程序“bash”的主程序路径。您的“fish”主程序的路径通常为“/usr/bin/fish”。
“/etc/shells”中列出系统中所有可用的Shell(“/bin/false”代表禁用Shell)

您也可以使用如下命令改变您的默认Shell
chsh -s /usr/bin/fish
(需要输入您的密码)

Tips:您可以使用“whereis xxx”命令,来查找“xxx”程序的安装位置,我们会在系统管理中向您详细介绍。

设定命令的搜索路径
==================
使用“echo $PATH”,可以显示“$PATH”变量,输出如下:
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/bin/X11 /usr/games /usr/X11R6/bin
它是一个环境变量,代表您所执行命令的搜索路径。
当您执行一个命令时,Shell会到“$PATH”变量定义的路径去搜索,并运行与您的命令同名的可执行文件。如果您的程序或者脚本等可执行文件并不包含在上面的路径中,您必须使用绝对路径或者相对路径定位您的可执行文件。
例如:
/usr/local/mplayer -menu xxx.rmvb
/etc/init.d/powernowd start

cd /usr/local/ && ./mplayer -menu xxx.rmvb

您可以修改“/etc/environment”文件来设定您的命令搜索路径,找到“PATH”起始的行
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin"
在双引号中添加您的自定义路径,并以“:”分隔。

技术相关: