Guide to Linux Shell (2009-07-14)

Page 1

丫为什么不工作?



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


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

© 2009 Corsair Sun Copyright sucks!


目录 1 认识 Shell 1.1 什么是 Shell 1.2 Shell 初体验 1.3 快捷功能 1.3.1 Tab 补全 1.3.2 历史查询 1.4 获取帮助

5 5 5 8 8 9 9

3


4


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 语法相

cmd.exe 或 dos 相提并论,使人们陡增对 shell 的恐惧。其实 Linux 里的 shell

似,基本能互相兼容;

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

1.2 Shell 初体验 Shell 必须运行在终端或伪终端内。终端就是上古时代原始人使用的那 种满屏绿色字符的东西,是一种字符设备。伪终端是现在普遍使用的设 备,Linux 中的伪终端一般可分为两种,即虚拟终端和终端模拟器。虚拟终

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

5

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


为什么使用 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\!,也就是

6


说,引号使得逗号后面的空格成为参数的一部分,而不是两个参数的分隔 符。反斜杠的作用是把后面的一个本来是 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 是无神论者。

7


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

8

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


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,后面可以写

9


一个或多个选项,也可以不写选项,在后面跟上一个或多个文件名,也可以 不写文件名。 再看看 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 字幕,而且在播放时还能随时截图。

10


练习 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 么?祝你丫好运。)在地球上最大的知识库里 搜索信息是一门小小的学问,如果网上居然也没有相关信息(我就遇到 过),唉……发挥你的想像力吧……顺便去买彩票。

11


12


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.