命令行是你的至交好友 -Part 1

命令行既可以成为你的至交好友,又可能成为你最大的敌人。它关键取决于你怎样用它,以及用它来做什么。如果你还是像大部分人一样畏惧使用命令行界面,那么这篇文章定会让你受益匪浅。
命令行界面?
是的,它是在黑色屏幕上的白色(或者绿色)的显示区域,是神秘的文字流和奇怪的命令执行的地方。我知道很多大师级的程序员从来不使用命令行界面;然而,我也知道一些初级用户用命令行来做所有的事而不是用图形界面。他们控制应用程序去浏览网页和文件系统,查收邮件,查看图片和编辑文字。他们甚至看youtyube视频和查看PDF文件都不使用图形界面!

最好的工作流程是取决于个人的。有些人倾向于图形界面,其他人则钟爱于命令行。
术语 刚刚接触Unix或者Linux的人在面对诸如终端,控制台和shell时是比较困惑的。

从用户的角度来看,它们之间似乎是没有太大区别的,但事实上,用户是使用控制台来连接终端来查看运行在计算机上的脚本。
在过去的时候,这三者是独立的硬件。控制台无非是一个显示器和一个键盘;它没有计算能力。它通过一个串行接口去连接终端,应用最广泛的是RS-232接口。
终端就像大型主机的界面。它一般具有计算、网络通信或进行其他特殊连接,如与大型主机连接的能力。终端也提供了对系统的管理者权限,这也是它为什么总是被关在小黑屋的原因。被雇用者使用连接到这些终端的控制台进行工作,但是却无法获得大型主机的管理者权限。控制台与终端最终合并为一个单独的设备,最好的例子的就是现代linux发行版中仿真的虚拟机终端。


shell就是一个可以读取用户输入,然后在屏幕输出结果的程序。一个shell可以是基于字符的(像CLI),或者是基于图形的(像Windows的GUI)。今天,shell已经不仅仅是用户与系统的接口,他还肩负着管理进程,窗口,应用程序,命令,以及系统的其他方面。
shell解释执行命令行中输入的命令,用户也可以将命令组合起来写成一个脚本。现代的shell拥有自己的脚本语言,这提供了执行复杂任务的能力。
大多数现代的Linux发行版,如同MacOSX一样,使用一个shell,BASH(译注:默认的,想用什么自己换)。Solaris和OpenIndiana默认使用KornShell,一个BASH的变种。请注意这篇指南主要讲的是BASH。
让我们说说 BASHBASH代表 BourneAgain Shell。它被作为 BourneShell 的新版本于1989年发布,之后成为了Unix系统的默认 shell。它由斯蒂芬·伯恩(StephenBourne)编写,用以取代 ThompsonShell。老版的 BourneShell 至今仍工作在一些 Unix系统中。通常你可以用 /bin/sh找到它。总之,尽管 BourneShell 在新的 Linux发行版中 已经为 BASH取代,/bin/sh和 /bin/bash都能被 BASH运行。
BASH的提示符
你永远都会碰到BASH的提示符。它是一个贯穿BASH及其历史的东西。如果篇幅允许,我们可以用所有篇幅讲讲如何按自己的希望配置BASH的提示符。但是,我们只会在这个指南中提到一些基本的东西。

我的BASH提示符就像上面那个样子。第一个词csaba是我的用户名,后接@和我的主机名称,最后是当前的文件夹。~这个字符代表了用户文件夹,对于我来说是/home/csaba。整行以$结尾,在$后面输入的东西是我想shell执行的命令。
当然,这仅仅是一个简单的例子。你可以放更多的东西进提示符中。来看看更多的例子吧。
PS1,PS2,PS3和PS4是BASH的特殊变量,它们控制着不同类型的提示符(例如PS2是一般使用于命令行里较长命令的换行提示信息)。我们在这篇指南中只用到PS1。你可以用下面的命令查看你的PS1变量。

输入命令echo$PS1,然后你就看见了我的PS1变量。在BASH中,我们将$到变量名称前就可以得到这个变量的内容。这个echo命令仅仅会输出它接到的参数。我们给echo的参数是变量的值,所以它会输出这个变量的值。

输出代表着一种格式。[\033[01;32m]表示绿色,\u表示当前用户的用户名。\h表示主机名,[\033[01;34m]表示蓝色,\w是当前目录,[\033[00m]是将文字后续输入的文字置为高亮灰色。通过下面的屏幕截图你能够更好地理解结果。

以“\”开头的特殊字符具有特别的意义。反之“\”标识后面的字符是一个转义字符(比如颜色代码)。下面的内容是从BASH官方手册中引用的,你可以在BASH命令中使用的特殊字符的完整列表:
[list]
[*]
\a- ASCII响铃字符(07)

[*]
\d– 以“Weekday Month Date”格式显示日期

[*]
\D{format}– format被传递给strftime(3)并把相应的结果插入到提示字符串中; 如果format为空则代表本地时间. 必须有在括号

[*]
\e– ASCII转义字符(033)

[*]
\h– 到第一个 `.’前代表主机名称

[*]
\H– 主机名称

[*]
\j– 当前被Shell管理工作数

[*]
\l– Shell终端设置名称的基本名

[*]
\n– 新行

[*]
\r– 回车

[*]
\s– Shell的名称

[*]
\T– 12小时制当前时间,格式为 HH:MM:SS

[*]
\t– 24小时制当前时间,格式为 HH:MM:SS

[*]
@– 12小时制当前时间,格式为am/pm

[*]
\A– 24小时制当前时间,格式为 HH:MM

[*]
\u– 当前用户的名称

[*]
\v– BASH版本

[*]
\V– BASH发行备注,版本号+补丁

[*]
\w– 当前工作目录,其中$HOME被缩写成"~"(使用PROMPT_DIRTRIM的值)

[*]
\W– 当前工作目录的basename,$HOME被缩写成"~"

[*]
!– 命令的使用次数

[*]
#– 命令号

[*]
$– 命令提示符,如果UID是0则显示为#,否则为$

[*]
\nnn– 8进制数据nnn代表的字符

[*]
\– 反斜杠

[*]
[- 开始一个非打印字符序列,这个序列可以嵌入一个终端控制序列到提示中

[*]]– 非打印字符序列结束
[/list]

;P土豆挂了