14
丫为什么不工作?

Guide to Linux Shell (2009-07-14)

Embed Size (px)

DESCRIPTION

A guide to Linux shell for newbies.

Citation preview

Page 1: Guide to Linux Shell (2009-07-14)

丫为什么不工作?

Page 2: Guide to Linux Shell (2009-07-14)
Page 3: Guide to Linux Shell (2009-07-14)

丫为什么不工作?Linux shell指南

Corsair Sun

Page 4: Guide to Linux Shell (2009-07-14)

本文档使用GNU FDL协议发布。

© 2009 Corsair SunCopyright sucks!

Page 5: Guide to Linux Shell (2009-07-14)

3

目录

1 认识 Shell 51.1 什么是 Shell 51.2 Shell初体验 51.3 快捷功能 81.3.1 Tab补全 81.3.2 历史查询 91.4 获取帮助 9

Page 6: Guide to Linux Shell (2009-07-14)

4

Page 7: Guide to Linux Shell (2009-07-14)

5

1认识 Shell

1.1 什么是 Shell

Shell是用户操作 Linux,运行系统中各个程序的交互式命令行界面。在没有彩色显示器的上古时代,shell是人类与计算机交互的最简单的途径;几十年后,这个古老的界面依然有其独特的优势,令众多 geek宅男流连忘返。在很多情况下,shell是用户操作计算机的唯一途径。

Shell的主要用途就是运行程序,并管理正在运行的程序(进程)。Shell本身也是一个程序,在 shell中嵌套地运行 shell是一个经常使用的技巧。Shell有很多种,目前最常用的是 Bourne-again shell (Bash)1,其他还

有Sh, Csh, Zsh, Tcsh等等。经常听一些人把 Linux shell和Windoze里的 Sh, Bash与 Zsh语法相似,基本能互相兼容;

Tcsh与Csh兼容。但这两组之间一般互不兼

容。

cmd.exe或 dos相提并论,使人们陡增对 shell的恐惧。其实 Linux里的 shell虽然和 dos界面都是运行程序的工具,但是两者的功能和方便程度不可同日而语。Linux shell中都有完整的进程管理,用户可以把在 shell中运行的程序随时切换到前台或后台,或休眠,或杀死,或者让这个程序脱离 shell。现在的 shell程序(比如Bash)中都有方便的自动完成功能,用户不需要记住文件的完整路径就可以快捷的引用。

1.2 Shell初体验

Shell必须运行在终端或伪终端内。终端就是上古时代原始人使用的那种满屏绿色字符的东西,是一种字符设备。伪终端是现在普遍使用的设

备,Linux中的伪终端一般可分为两种,即虚拟终端和终端模拟器。虚拟终

以后本文中未经注明的 shell程序都是指Bash1

Page 8: Guide to Linux Shell (2009-07-14)

6

为什么使用 shell

最重要的原因是效率。在进行大部分日常操作(比如复制、删除文件,查看邮件,甚至聊天)的时候,命令行方式比鼠标方式有明显的速度优势。也有很多人使用 shell是因为它强大的批处理能力。在 Linux社区中经常爆发命令行界面(cli)vs.图形界面(gui)的论战。Gui一派的主要论点论据是图形界面直观易学,以及某些程序对 gui的显然要求(比如视频后期处理,cad. . .);而cli一派的理论则是命令行快速有效,尤其适合批量任务。有趣的是,两方都认为自己支持的界面“简单易用”。希望你在学会 shell后能产生自己的看法。

端就是有些用户所说的“控制台”,存在图形界面之外,是纯粹的“文本

界面”,默认情况下共有六个。终端模拟器是一个 gui程序,它窗口中的内容就是一个伪终端。在大多数情况下我们都会使用一个终端模拟器

运行 shell。大部分 Linux发行版在装好以后都会搭载一个默认的终端模拟器。Gnome桌面环境的终端模拟器一般是Gnome-terminal,kde桌面的很可能是Konsole。

打开你选择的终端模拟器,它一般会自动运行一个默认的 shell,你会首先看到 shell的提示符,它一般是这个样子

username@host$

其中的 username是你的用户名,host是你的计算机的名字。你的提示

符可能比这个更复杂,但重要的是结尾的 $,他告诉我们 shell已经准备好接受用户输入了。下面我们输入 echo "Hello, world\!"并回车,你会看到 shell打印了一行经典的 Hello, world!然后又显示了提示符。

刚才发生了什么?首先看看我们的输入。上述命令中的 echo是一个

Bash内建指令,它的作用是把参数原原本本的打印出来。从这里我们可以看出,在一个 shell命令中,第一个单词是程序的名字,后面的东西都是传给这个程序的参数。有人说了,不对!你的参数中有引号和反斜杠,怎么没有

打印出来?原因是这两个符号对于 echo指令来说是不可见的,它们是 shell本身使用的“功能字符”。引号的作用是限定参数的范围,这样 Hello,

world\!会被识别为一整个参数,而不是两个参数 Hello,和 world\!,也就是

Page 9: Guide to Linux Shell (2009-07-14)

7

说,引号使得逗号后面的空格成为参数的一部分,而不是两个参数的分隔

符。反斜杠的作用是把后面的一个本来是 shell功能字符的字符变为普通字符,所以反斜杠被称为转义字符。在这里,它把 !变为了一个 echo可见的普

通字符。符号 !本来的作用与 shell的命令历史记录有关。

练习 1 如何使用 echo打印 "Hello, world!",包含引号?

练习 2 想想如果正文中的 echo命令没有加引号,能否打印出我们想要的东

西?思考之后实践一下。

下面再看一个有用一点的命令

cat /etc/fstab

这个命令的作用是打印出文件 /etc/fstab的内容。这实际上是我们第

一次在 shell里运行程序,因为 cat与 echo不同,echo是一个 shell内建指令,他是 shell自带的功能,而 cat是一个程序(或者叫软件),当你在 shell里调用它时,shell会启动这个程序,并等待它结束(或叫返回)。当然,这一切都被隐藏在 shell简洁的界面下。用户甚至都不用知道一个名字是程序还是内建指令还是别名还是函数,用户需要做的只是输入“名字参数1参数2 . . .”并等待结果。

不过我们有些时候需要明确的知道一个名字是一个程序还是内建指

令。这个需求可以使用 type完成。输入 type echo,会打印出

echo is a shell builtin

说明 echo是一个 shell内建指令。输入 type cat,得到

cat is /bin/cat

说明 cat是一个程序,位置是 /bin/cat。

练习 3 命令 type本身是程序还是 shell内建指令?

练习 4 j使用 type证明 shell是无神论者。

Page 10: Guide to Linux Shell (2009-07-14)

8

Linux的目录结构

Linux使用具有单一根节点的树形目录结构。最上层目录为根目录/,其下有/home, /usr, /bin等目录。其中 /home存放各用户的个人文件,/usr中存放系统中的大部分程序、库、文档等,/bin中存放小部分非常重要的程序。

1.3 快捷功能

1.3.1 Tab补全

有人说了,cat那个例子也太搓了吧。如果文件名是 /usr/local/tex

live/2007/texmf-dist/tex/latex/asymptote/asymptote.sty,你难道要把这

一长串目录都记住么?当然不用了!Shell提供了 tab补全功能,用户无需记住任何一个目录的具体名字也可以快速的找到那个目录。比如你可以输入

/usr/lo,然后按下 tab 键,然后 shell就会给你补全为 /usr/local。又有

人说了,如果我连开头的 lo都忘了呢?那就输入 /usr/然后按下两次 tab

,shell就会把 /usr之下的所有目录和文件都列出来让你选。如果你忘了程

序的名字叫 cat,你也可以输入 c然后按下两次 tab 来获得所有以“c”开头的程序或内建指令的名字。总之,当你忘了一个东西该怎么写的时候,就按

下 tab ,如果没有任何变化,就再按一次,然后从列表中选择。

广告时间

不同的 shell程序,或者相同的 shell不同配置下可能有不同的 tab补全行为。Zsh在 tab补全方面是最强大的,通过编写脚本,Zsh可以补全任何东西(比如命令行参数),并且 Zsh还有这样的功能:输入/usr/lo/tex/2/te/te/la/a/asy.sty,然后按下 tab ,Zsh就会自动补全为上面那个很长的路径。

练习 5 如何查看 shell里所有可以运行的东东的名字?

Page 11: Guide to Linux Shell (2009-07-14)

9

1.3.2 历史查询

一般来说,shell会保存你输入过的命令以便日后查看或再次使用。要使用以前用过的命令,最简单的方法就是使用上下箭头键。找到需要的命令

后,可以编辑或者直接按下回车执行。如果你知道以前的命令的一部分,也

可以按下 ctrl+r ,然后输入那部分,shell就会寻找所有包含那部分的历史,你可以按 ctrl+r 来切换。如果你输错了,按下 ctrl+g 取消。

1.4 获取帮助

即便是使用多年的老手,在面对mplayer这样有着无数命令行参数的程序时也会晕菜。这时,很囧的老手们都会做一件事—— man mplayer,然后只

听键盘一阵乱响,只见屏幕一阵乱闪,老手们已经找到了他们需要的参

数,开始使用了。这里的man就是 Linux里最常用的手册查看程序。当你面对一个程序不知所措时,你应该做的第一件事很可能就是键入 man程序名然

后回车。比如我可以看一下刚才用的 cat的完整手册

man cat

这是终端里应该显示出一个排版很整齐的 cat手册。Man手册有一些通用的格式,比如第一节一般都叫 NAME,说明这个程序的名字和简单描述,第二节 SYNOPSIS,说明这个程序的命令格式,第三节DESCRIPTION详细描述这个程序的作用,一些简单的程序(比如现在看的 cat)会把命令行参数的解释也列在这里,对于复杂的程序,参数说明可能会单独列在第四

节OPTIONS。这里我们看到,cat的作用是“连接”一个文件,并打印到标准输出。下面我们仔细看一看 cat的格式。第二节里说,cat的使用方法是

cat [OPTION]... [FILE]...

这里的 OPTION表示下面列出的一个选项,FILE表示一个文件的路

径,中括号里的内容是可选的,需要时就写上,不需要就不写,省略号表示

前面的东西可以多次重复。所以 cat的格式用白话来说就是 cat,后面可以写

Page 12: Guide to Linux Shell (2009-07-14)

10

一个或多个选项,也可以不写选项,在后面跟上一个或多个文件名,也可以

不写文件名。

再看看 cat的选项。手册里列出的第一个选项是 -A, --show-all。注意

很多 Linux程序的一个选项有两种写法——长的和短的,使用时可以根据需要选择一个。Gnu/Linux要求短选项以一个减号开头,后跟一个大写或小写字母,长选项以两个减号开头,后跟一个或多个以小写字母组成的单词,单

词之间用一个减号分隔。这个 -A选项的描述是“与-vET相同”。有人说

了,你丫胡说八道,这里不是出现了以一个减号开头的长选项么?其实 -vET

只是 -v -E -T的简单写法,大部分使用短选项的程序都可以把多个短选项这

样简写。不熟悉编程的小朋友请注意:这些选项的规则只适用于一部分程

序,换句话说,这只是Gnu对程序开发者的建议,实际是否遵守完全是开发者的个人喜好问题,比如X.org的工具的选项就都是以一个减号开头的长选项。现在继续讨论 -A的功能。根据手册的解释,我们需要了解 -v, -E和 -T

三个选项的功能。往下找,手册里列出的第四个选项就是 -E,作用是在每一

行的末尾显示一个 $。继续找 -T,如果你的终端窗口比较小,可能只能看到

几个选项,当然你可以使用上下箭头键来滚动,不过更方便的方法是使用 j

来向下滚动,使用 k 向上滚动,这样你的手就可以一直放在主键区。选项

-T的作用是把制表符显示为 ^I,很奇怪的功能,不过这样就可以方便的区分

制表符和空格了。最后,-v的作用是使用某种诡异的表示法显示出文件里的

不可显示字符(比如各种Ascii控制字符)。综上所述,选项 -A的作用就是

把一个文件里的一切都明确的显示出来,它的长形式 --show-all很恰当的描

述了这个功能。

终于,费了九牛二虎之力后,我们掌握了 cat程序的一个选项的用法……也许你觉得man实在是太难用太麻烦了,但是当你熟练之后,你一定会依赖这个程序生活。有一天,你也可以在查看man手册之后(或者根本就不用查手册!),轻松地写出 find . -type f -exec chmod 644 '{}'

\;来递归地设置当前目录下所有文件的权限,或者 mplayer -vobsub blabla

-vf screenshot -zoom -framedrop xxxx.mkv来播放高清电影,并且使用外部

的 vobsub字幕,而且在播放时还能随时截图。

Page 13: Guide to Linux Shell (2009-07-14)

11

练习 6 学习man程序的详细用法,了解man手册的分区(sections)。

如果你需要学习的程序没有man手册,你可以试试 info。用法也是 info

程序名。Info手册一般比man手册要详细的多,而且组织的更加结构化,但是使用起来比较复杂。你可以输入 info info来学习使用 info。(-_-!)

如果这个程序既没有man手册,也没有 info手册,那么你可以诅咒一下程序的作者,然后尝试下面的命令(假定程序的名字是 foo):

foo --help

foo -h

foo "-?"

foo -help

以上三种获取帮助的方法称为RTFM (Read The F*cking Manual),如果全都不奏效,还有最后一种方法——STFW (Search The F*cking Web),也就是Google。(你喜欢用 baidu么?祝你丫好运。)在地球上最大的知识库里搜索信息是一门小小的学问,如果网上居然也没有相关信息(我就遇到

过),唉……发挥你的想像力吧……顺便去买彩票。

Page 14: Guide to Linux Shell (2009-07-14)

12