命令行是你的至交好友 已翻译 100%

傅小黑 投递于 2013/03/08 00:07 (共 36 段, 翻译完成于 03-12)
阅读 15237
收藏 354
58
加载中

命令行既可以成为你的至交好友,又可能成为你最大的敌人。它关键取决于你怎样用它,以及用它来做什么。如果你还是像大部分人一样畏惧使用命令行界面,那么这篇文章定会让你受益匪浅。

命令行界面?

是的,它是在黑色屏幕上的白色(或者绿色)的显示区域,是神秘的文字流和奇怪的命令执行的地方。我知道很多大师级的程序员从来不使用命令行界面;然而,我也知道一些初级用户用命令行来做所有的事而不是用图形界面。他们控制应用程序去浏览网页和文件系统,查收邮件,查看图片和编辑文字。他们甚至看youtyube视频和查看PDF文件都不使用图形界面!

最好的工作流程是取决于个人的。有些人倾向于图形界面,其他人则钟爱于命令行。


o轻扬o
o轻扬o
翻译于 2013/03/11 15:50
7

术语

刚刚接触Unix或者Linux的人在面对诸如终端,控制台和shell时是比较困惑的。

从用户的角度来看,它们之间似乎是没有太大区别的,但事实上,用户是使用控制台来连接终端来查看运行在计算机上的脚本。

在过去的时候,这三者是独立的硬件。控制台无非是一个显示器和一个键盘;它没有计算能力。它通过一个串行接口去连接终端,应用最广泛的是RS-232接口。

o轻扬o
o轻扬o
翻译于 2013/03/11 16:00
6

终端就像大型主机的界面。它一般具有计算、网络通信或进行其他特殊连接,如与大型主机连接的能力。终端也提供了对系统的管理者权限,这也是它为什么总是被关在小黑屋的原因。被雇用者使用连接到这些终端的控制台进行工作,但是却无法获得大型主机的管理者权限。控制台与终端最终合并为一个单独的设备,最好的例子的就是现代linux发行版中仿真的虚拟机终端。

ShaoFantasy
ShaoFantasy
翻译于 2013/03/11 19:06
7

shell就是一个可以读取用户输入,然后在屏幕输出结果的程序。一个shell可以是基于字符的(像CLI),或者是基于图形的(像Windows的GUI)。今天,shell已经不仅仅是用户与系统的接口,他还肩负着管理进程,窗口,应用程序,命令,以及系统的其他方面。

shell解释执行命令行中输入的命令,用户也可以将命令组合起来写成一个脚本。现代的shell拥有自己的脚本语言,这提供了执行复杂任务的能力。

大多数现代的Linux发行版,如同Mac OSX一样,使用一个shell,BASH(译注:默认的,想用什么自己换)。Solaris和OpenIndiana默认使用Korn Shell,一个BASH的变种。请注意这篇指南主要讲的是BASH。

crab2313
crab2313
翻译于 2013/03/11 21:48
7

让我们说说 BASH

BASH 代表 Bourne Again Shell。它被作为 Bourne Shell 的新版本于1989年发布,之后成为了 Unix 系统的默认 shell。它由斯蒂芬·伯恩(Stephen Bourne)编写,用以取代 Thompson Shell。老版的 Bourne Shell 至今仍工作在一些 Unix 系统中。通常你可以用 /bin/sh 找到它。总之,尽管 Bourne Shell 在新的 Linux 发行版中 已经为 BASH 取代,/bin/sh 和 /bin/bash 都能被 BASH 运行。

K6F
K6F
翻译于 2013/03/11 16:52
7

BASH的提示符

你永远都会碰到BASH的提示符。它是一个贯穿BASH及其历史的东西。如果篇幅允许,我们可以用所有篇幅讲讲如何按自己的希望配置BASH的提示符。但是,我们只会在这个指南中提到一些基本的东西。

csaba@csaba-pc ~/Personal/Programming/NetTuts$

我的BASH提示符就像上面那个样子。 第一个词csaba是我的用户名,后接@和我的主机名称,最后是当前的文件夹。~这个字符代表了用户文件夹,对于我来说是/home/csaba。整行以$结尾,在$后面输入的东西是我想shell执行的命令。

crab2313
crab2313
翻译于 2013/03/11 21:13
5

当然,这仅仅是一个简单的例子。你可以放更多的东西进提示符中。来看看更多的例子吧。

PS1,PS2,PS3和PS4是BASH的特殊变量,它们控制着不同类型的提示符(例如PS2是一般使用于命令行里较长命令的换行提示信息)。我们在这篇指南中只用到PS1。你可以用下面的命令查看你的PS1变量。

csaba@csaba-pc ~/Personal/Programming/NetTuts $ echo $PS1
\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]

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

crab2313
crab2313
翻译于 2013/03/11 21:29
5

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


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

  • \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代表的字符
  • \\– 反斜杠
  • \[- 开始一个非打印字符序列,这个序列可以嵌入一个终端控制序列到提示中
  • \]– 非打印字符序列结束
晴风晓月
晴风晓月
翻译于 2013/03/12 09:34
7

操作目录和文件

在命令行环境中,每个人都要做的一件事就是操作文件系统,创建,删除,复制和移动文件系统对象,并且执行命令。这对你来说可能已经是家常便饭,然而,还是让我们来看一眼:

csaba@csaba-pc ~ $ mkdir ~/tmp/NetTuts
csaba@csaba-pc ~ $ cd ~/tmp/NetTuts/
csaba@csaba-pc ~/tmp/NetTuts $ mkdir ./AnotherDir
csaba@csaba-pc ~/tmp/NetTuts $ mkdir ./SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ touch ./SecondDir/aFile
csaba@csaba-pc ~/tmp/NetTuts $ touch ./SecondDir/AnotherFile
csaba@csaba-pc ~/tmp/NetTuts $ cd ./SecondDir/
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ pushd ~/tmp/NetTuts
~/tmp/NetTuts ~/tmp/NetTuts/SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 16
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .
drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ popd
~/tmp/NetTuts/SecondDir
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al
total 8
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 .
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
-rw-r--r-- 1 csaba csaba    0 Feb 19 21:09 aFile
-rw-r--r-- 1 csaba csaba    0 Feb 19 21:09 AnotherFile
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $
逐句解释:
  1. /home/csaba/tmp下创建一个名为NetTuts的目录
  2. 将刚刚创建的目录切换为当前目录
  3. 在当前目录下创建一个名为“AnotherDir”的目录
  4. 在当前目录下创建一个名为SecondDir的目录
  5. 使用touch命令在SecondDir目录下创建两个空文件
  6. 切换当前目录到SecondDir.
  7. 使用pushd命令切换目录到~/tmp/NetTuts来把当前目录存储到堆栈之中
  8. 列出目录~/tmp/NetTuts下的所有文件
  9. 使用popd命令来返回前一个目录,这样会从堆栈中获取并且移除最顶层的目录
  10. 再一次列出内容会看到我们上几步所创建的两个文件
o轻扬o
o轻扬o
翻译于 2013/03/11 17:34
6

当然,对于命令行你们可以有个万能文件管理器,称之为Midnight Commander。要开始用的时候只需要执行它的命令就行。它也内置了文本编辑器(高亮代码的那段)适合大部分语言,而且有智能缩进和其他的一些特性。它不完全是一个被夸大的编辑器,事实上,它是一个相当简单的工具,特别适合简单和快速编辑。你可以随意的选择任何文件然后按F4,或者你可以在编辑模式下直接打开一个文件。

csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ mcedit ./aFile

开源中国驻联合国理事
开源中国驻联合国理事
翻译于 2013/03/12 14:28
5
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(44)

赵云30
赵云30
唉 想我bash什么的要算是炉火纯青了 还是搞不清terminal 控制台这些乱七八糟的术语。
simply
simply
拖到地已经不容易了
golang
golang

引用来自“zhuang”的评论

好的,不错.. 我也让我老娘学习下..

牛x..女的搞IT都是精英
golang
golang
不错学习了
liuroger
liuroger
楼主强大,这么长的文章翻译出来,并且简单易懂!谢谢!
phoniex
phoniex

引用来自“phoniex”的评论

在我的系统(UBUNTU)上,
find . -name *File 1>./SecondDir/ThirdFile 2>&1
find . -name *File 2>./SecondDir/ThirdFile 1>&2
的输出结果相同!
是否意味着,>重定向符号只是重定向
而与各个通道结果在最终接收文件 ThirdFile 的排序无关?

PS: 都是先标准输出的内容,然后才是标准错误输出的内容
phoniex
phoniex
在我的系统(UBUNTU)上,
find . -name *File 1>./SecondDir/ThirdFile 2>&1
find . -name *File 2>./SecondDir/ThirdFile 1>&2
的输出结果相同!
是否意味着,>重定向符号只是重定向
而与各个通道结果在最终接收文件 ThirdFile 的排序无关?
Fanxme
Fanxme
谢谢大家的翻译, 辛苦了
R
Randy.Su
不错 有空回来看看 参考!
王洪旭
王洪旭
感谢分享
返回顶部
顶部