linux shellbash说明.docx

上传人:b****1 文档编号:987472 上传时间:2023-04-30 格式:DOCX 页数:22 大小:28.92KB
下载 相关 举报
linux shellbash说明.docx_第1页
第1页 / 共22页
linux shellbash说明.docx_第2页
第2页 / 共22页
linux shellbash说明.docx_第3页
第3页 / 共22页
linux shellbash说明.docx_第4页
第4页 / 共22页
linux shellbash说明.docx_第5页
第5页 / 共22页
linux shellbash说明.docx_第6页
第6页 / 共22页
linux shellbash说明.docx_第7页
第7页 / 共22页
linux shellbash说明.docx_第8页
第8页 / 共22页
linux shellbash说明.docx_第9页
第9页 / 共22页
linux shellbash说明.docx_第10页
第10页 / 共22页
linux shellbash说明.docx_第11页
第11页 / 共22页
linux shellbash说明.docx_第12页
第12页 / 共22页
linux shellbash说明.docx_第13页
第13页 / 共22页
linux shellbash说明.docx_第14页
第14页 / 共22页
linux shellbash说明.docx_第15页
第15页 / 共22页
linux shellbash说明.docx_第16页
第16页 / 共22页
linux shellbash说明.docx_第17页
第17页 / 共22页
linux shellbash说明.docx_第18页
第18页 / 共22页
linux shellbash说明.docx_第19页
第19页 / 共22页
linux shellbash说明.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

linux shellbash说明.docx

《linux shellbash说明.docx》由会员分享,可在线阅读,更多相关《linux shellbash说明.docx(22页珍藏版)》请在冰点文库上搜索。

linux shellbash说明.docx

linuxshellbash说明

bash

前言

  本文译自《SlackwareLinuxUnleashed》(第三版)一书的bash一章,但做了一些必要的删节,并且有的地方根据实际情况作了较大的改动,必要的话请参考原文。

对本文有任何问题的话请与我联系:

con@

简介

  本文将较为详细地介绍Linux下最常用的shell,bash。

bash(BourneAgainShell)是Linux的缺省shell,并被大多数用户所使用,在本文中你将学会:

  什么是shell

  Linux上最常见的shell

  命令补齐(Command-linecompletion)和通配

  命令历史记录(Commandhistory)和别名

  重定向和管道

  改变提示符

  进程控制(Jobcontrol)

  如何用户化配置你的bashshell

  另外你还将看到一些最常用的bash命令和内存变量的用法,读完本文后你将能更快和更有效地使用bash。

ShellsinaNutshell

  什么是shell?

总之这个词好象总是出现在Linux里,但很多新用户并不清楚它的明确的含义。

本节将给出一个确切的解释并说明为什么在Linux中它显得如此的重要。

什么是Shell?

    shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。

你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。

--------------------------------------------------------------------------------

注意:

如果你熟悉m$-dos,你将认出这很象DOS用户和COMMAND.COM之间的关系。

    一的区别是的功能远不能和shell相提并论。

--------------------------------------------------------------------------------

    shell是一个命令语言解释器(command-languageinterpreter)。

拥有自己内建的shell命令集。

此外,shell也能被系统中其他有效的Linux实用程序和应用程序(utilitiesandapplicationprograms)所调用。

  不论何时你键入一个命令,它都被Linuxshell所解释。

一些命令,比如打印当前工作目录命令(pwd),是包含在Linuxbash内部的(就象DOS的内部命令)。

其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。

而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还是一个单独的程序。

  附图

展示了shell是如何执行命令解释的,shell首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux本身的实用程序,比如ls和rm,也可以是购买的商业程序,比如xv,或者是公用软件(publicdomainsoftware),就象ghostview。

然后shell试着在搜索路径里寻找这些应用程序。

搜索路径是一个能找到可执行程序的目录列表。

如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。

而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。

  shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持在高级语言里所能见到的绝大多数程序控制结构,比如循环,函数,变量和数组。

shell编程语言很易学,并且一旦掌握后它将成为你的得力工具。

任何在提示符下能键入的命令也能放到一个可执行的shell程序里,这意味着用shell语言能简单地重复执行某一任务。

shell如何启动

  shell在你成功地登录进入系统后启动,并始终作为你与系统内核的交互手段直至你退出系统。

你系统上的每位用户都有一个缺省的shell。

每个用户的缺省shell在系统里的passwd文件里被指定,该文件的路径是/etc/passwd。

passwd文件里还包含有其他东西:

每个人的用户ID号,一个口令加密后的拷贝和用户登录后立即执行的程序,(注:

为了加强安全性,现在的系统一般都把加密的口令放在另一个文件--shadow中,而passwd中存放口令的部分以一个x字符代替)虽然没有严格规定这个程序必须是某个Linuxshell,但大多数情况下都如此。

  

最常用的shell

  在Linux和UNIX系统里可以使用多种不同的shell可以使用。

最常用的几种是Bourneshell(sh),Cshell(csh),和Kornshell(ksh)。

三种shell都有它们的优点和缺点。

Bourneshell的作者是StevenBourne。

它是UNIX最初使用的shell并且在每种UNIX上都可以使用。

Bourneshell在shell编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种shell。

  Cshell由BillJoy所写,它更多的考虑了用户界面的友好性。

它支持象命令补齐(command-linecompletion)等一些Bourneshell所不支持的特性。

普遍认为Cshell的编程接口做的不如Bourneshell,但Cshell被很多C  程序员使用因为Cshell的语法和C语言的很相似,这也是Cshell名称的由来。

  Kornshell(ksh)由DaveKorn所写。

它集合了Cshell和Bourneshell的优点并且和Bourneshell完全兼容。

  除了这些shell以外,许多其他的shell程序吸收了这些原来的shell程序的优点而成为新的shell。

在Linux上常见的有tcsh(csh的扩展),BourneAgainshell(bash,sh的扩展),和PublicDomainKornshell(pdksh,ksh的扩展)。

bash是大多数Linux系统的缺省shell。

TheBourneAgainShell

  

  

  BourneAgainshell(bash),正如它的名字所暗示的,是Bourneshell的扩展。

bash与Bourneshell完全向后兼容,并且在Bourneshell的基础上增加和增强了很多特性。

bash也包含了很多C和Kornshell里的优点。

bash有很灵活和强大的编程接口,同时又有很友好的用户界面。

  为什么要用bash来代替sh呢?

Bourneshell最大的缺点在于它处理用户的输入方面。

在Bourneshell里键入命令会很麻烦,尤其当你键入很多相似的命令时。

而bash准备了几种特性使命令的输入变得更容易。

命令补齐(Command-LineCompletion)

  通常你在bash(或任何其他的shell)下输入命令时你不必把命令输全shell就能判断出你所要输入的命令。

例如,假定当前的工作目录包含以下的文件和子目录:

News/bin/games/mail/samplefiletest/

  如果你要进入test子目录,你将会输入以下的命令:

cdtest

  这个命令能够满足你的需要,但bash还提供了稍微不同的方法来完成同样的事。

因为test是当前目录里唯一以字母t开头的子目录,bash在你只输入字母t后就能判断出你要做什么了:

cdt

  在你键入那个字母后,唯一的可能就是test。

想让bash帮你结束命令的话,按下Tab键:

  

cdt;

  当你这样做以后,bash将帮你补齐命令并显示在屏幕上。

但在你按下回车键以前命令并没有被执行,bash会让你检验补齐的命令是否是你真正需要的。

在输入象这样短的命令时你也许看不出它的价值所在,甚至在命令很短时还会简慢输入的速度,但是当你要输入的命令有点长时,你会发现这个特性是多么的美好。

  但是当目录里有不止一个以字母t开头的文件时会发生什么情况呢?

在你使用命令补齐时会有问题,让我们看看下面的情况,当前目录里有下列内容:

News/  bin/  mail/  samplefile  test/  tools/working/

  现在这个目录里有两个以字母t开头的文件。

假设你仍然想进入test子目录,如何使用命令补齐呢?

如果你象先前那样键入:

cdt;

  bash将不知道你到底想进入哪个子目录,因为给出的信息并不唯一。

如果你这样做了的话,bash将发出一声蜂鸣提醒你没有足够的信息来补齐你的命令。

蜂鸣之后bash并不改变输入的命令,这将使你能在原来的基础上再输入更多的信息,在这个例子中你仅需再键入一个e并再按一下Tab键,这时bash就有足够的信息来完成你的命令了:

cdtest

  当你输入命令时不论何时按下Tab键,bash都将尽其所能地试图补齐命令,不行的话会发出蜂鸣来提醒你需要更多的信息。

你需要键入更多的字符,并再次按下Tab键,重复这个过程直至你期望的命令出现。

通配符

  另一个使命令输入变得更简单的方法是在命令中使用通配符。

bash支持三种通配符:

1.*    匹配任何字符和任何数目的字符

2.

3.?

    匹配任何单字符

4.

5.[...]  匹配任何包含在括号里的单字符

复制代码

  *通配符的使用有些象命令补齐。

例如,假设当前目录包含以下文件:

News/  bin/  games/  mail/  samplefile  test/

  如果你想进入test目录,你将键入cdtest,或者你想用命令补齐:

cdt;

  现在有第三种方法来做同样的事。

因为仅有一个文件以字母t开头,你也能用*通配符来进入该目录。

键入下列命令:

cdt*

  *匹配任何字符和任何数目的字符,所以shell将把t*替换为test(当前目录里唯一和通配方案匹配的文件)。

当前目录里只有一个文件以字母t开头的话这将是可靠的。

但是如果当前目录里有不止一个文件以字母t开头,shell将试着进入第一个符合匹配方案的目录,这个目录是以字母表排序的第一个目录,这个目录也许是也许不是你所期望的。

  通配符*的一个更实际的用途是通配你要执行的命令中的多个名字相似的文件。

例如,假设当前目录里包含以下文件:

ch1.doc  ch2.doc  ch3.doc  chimp  config  mail/  test/  tools/

  如果你需要打印所有扩展名是.doc的文件,你能使用象这样简化的命令:

lpr*.doc

  在这个例子中,bash将把*.doc替换为当前目录下所有文件名符合通配方案的文件。

在bash进行了替换后,该命令将被处理为:

lprch1.docch2.docch3.doc

  lpr命令将以ch1.doc,ch2.doc,和ch3.doc为参数被调用。

--------------------------------------------------------------------------------

  注意:

除了以上给出的例子外,还有几种方法:

        lpr*doc

        lpr*oc

        lpr*c

--------------------------------------------------------------------------------

  通配符?

除了只能匹配单个字符外,其他功能都与通配符*  相同,如果用通配符?

来打印前面提到的那个目录里所有扩展名是.doc的文件的话,键入下面的命令:

lprch?

.doc

  通配符[...]能匹配括号中给出的字符或字符范围。

同样以前面的目录为例,打印那个目录里所有扩展名是.doc的文件,你可以键入下列命令之一:

lprch[123].doc

或者:

lprch[1-3].doc

命令历史记录

  bash也支持命令历史记录。

这意味着bash保留了一定数目的你先前已经在shell里输入过的命令。

这个数目取决于一个叫做HISTSIZE的变量。

有关HISTSIZE的更多信息,请看本文后面的“bash变量”一节。

  bash把你先前输入的命令文本保存在一个历史列表中。

当你用你的帐号登录后历史列表将根据一个历史文件被初始化。

历史文件的文件名被一个叫HISTFILE的bash变量指定。

历史文件的缺省名字是.bash_history。

这个文件通常在你的用户目录中。

(注意该文件的文件名以一个句号开头,这意味着它是隐含的,仅当你带-a或-A参数的ls命令列目录时才可见)

  仅将先前的命令存在历史文件里是没有用的,所以bash提供了几种方法来调用它们。

使用历史记录列表最简单的方法是用上方向键。

按下上方向键后最后键入的命令将出现在命令行上。

再按一下则倒数第二条命令会出现,以此类推。

如果上翻多了的话也可以用向下的方向键来下翻。

(和DOS实用程序doskey一样)如果需要的话,显示在命令行上的历史命令可以被编辑。

  另一个使用命令历史文件的方法是用bash的内部命令history和fc(fix命令)命令来显示和编辑历史命令。

history命令能以两种不同的方法来调用。

第一种是:

history[n]

  当history命令没有参数时,整个历史命令列表的内容将被显示出来。

下面是一个命令历史列表的例子:

1.1  mkdir/usr/games/pool

2.

3.2  cpXpoolTable-1.2.linux.tar.z/usr/games/pool

4.

5.3  cd/usr/games/pool/

6.

7.4  ls

8.

9.5  gunzipXpoolTable-1.2.linux.tar.z

10.

11.6  tar-xfXpoolTable-1.2.linux.tar

12.

13.7  ls

14.

15.8  cdXpool

16.

17.9  ls

18.

19.10  xinit

20.

21.11  exit

22.

23.12  whichzip

24.

25.13  zip

26.

27.14  morereadme

28.

29.15  vireadme

30.

31.16  exit

复制代码

  使用n参数的作用是仅有最后n个历史命令会被列出。

例如,history5显示最后5个命令。

  调用history命令的第二种方法用于修改命令历史列表文件的内容。

命令的语法如下:

1.history[-r|w|a|n][filename]

复制代码

  这种形式中,-r选项告诉history命令读命令历史列表文件的内容并且把它们当作当前的命令历史列表。

-w选项将把当前的命令历史记录写入文件中并覆盖文件原来的内容。

-a选项把当前的命令历史记录追加到文件中。

-n选项将读取文件中的内容并加入到当前历史命令列表中。

如果filename选项没有被指定,history命令将用变量HISTFILE的值来代替。

  fc命令能用两种方法来编辑历史命令。

第一种使用下列语法:

1.fc[-eeditor_name][-n][-l][-r][first][last]

复制代码

  这里所有参数都是可选的。

-eeditor_name选项用来指定用于编辑命令的文本编辑器。

first和last选项用于选择列出历史命令的范围,既可以是数字也可以是字符串。

-n选项禁止列出命令的编号。

-r选项反向列出匹配的命令。

-l选项把匹配的命令行列在屏幕上(而不是在编辑器中)。

如果-eeditor_name参数没有被指定,则以变量FCEDIT的值来代替,如果该变量不存在的话,则用变量EDITOR的值来代替,都不存在的话将使用vi编辑器。

别名

  bash的另一个使你的工作变得轻松的方法是命令别名。

命令别名通常是其他命令的缩写,用来减少键盘输入。

例如,你经常要键入如下的命令,你也许会倾向于为它建立一个别名来减少工作量:

cd/usr/X11/lib/X11/fvwm/sample-configs

  假如为这个长命令建立一个名为goconfig的别名,在bash提示符下键入如下命令:

aliasgoconfig='cd/usr/X11/lib/X11/fvwm/sample-configs'

  现在,除非你退出bash,键入goconfig将和原来的长命令有同样的作用。

如果想取消别名,可以使用下面的命令:

unaliasgoconfig

  这是一些很多用户认为有用的别名,你可以把它们写入你的.profile文件中提高工作效:

  

1.aliasll='ls-l'

2.

3.  aliaslog='logout'

4.

5.  aliasls='ls-F'

复制代码

  如果你是一名DOS用户并且习惯了DOS命令,你能下面的别名定义使你的Linux表现得象DOS一样:

  

1.aliasdir='ls'

2.

3.  aliascopy='cp'

4.

5.  aliasrename='mv'

6.

7.  aliasmd='mkdir'

8.

9.  aliasrd='rmdir'

复制代码

--------------------------------------------------------------------------------

  注意:

在定义别名时,等号的两头不能有空格,否则shell不能决定你需要做        什么。

仅在你的命令中包含有空格或特殊字符时才需要引号。

--------------------------------------------------------------------------------

  如果你键入不带任何参数的alias命令,将显示所有已定义的别名,例如:

1.aliasdir='ls'

2.

3.aliasll='ls-l'

4.

5.aliasls='ls-F'

6.

7.aliasmd='mkdir'

8.

9.aliasnet='term;/dev/modem2>;/dev/null&'

10.

11.aliasrd='rmdir'

复制代码

输入重定向

    输入重定向用于改变一个命令的输入源。

一些命令需要在命令行里输入足够的信息才能工作。

比如rm,你必须在命令行里告诉rm它你要删除的文件。

另一些命令则需要更详细的输入,这些命令的输入可能是一个文件。

比如命令wc统计输入给它的文件里的文件里的字符数,单词数和行数。

如果你仅在命令行上键入wc;,wc将等待你告诉它要统计什么,这时bash就好象死了一样,你键入的每样东西都出现在屏幕上,但什么事也不会发生。

这是因为wc命令正在为自己收集输入。

如果你按下Ctrl-D,wc命令的结果将被写在屏幕上。

如果你输入一个文件名做参数,象下面的例子一样,wc将返回文件所包含的字符数,单词数,和行数:

wctest

1121

  另一种把test文件内容传给wc命令的方法是重定向wc的输入。

<符号在bash里用于把当前命令的输入重定向为指定的文件。

所以可以用下面的命令来把wc命令的输入重定向为test文件:

wc

1121

  输入重定向并不经常使用因为大多数命令都以参数的形式在命令行上指定输入文件的文件名。

尽管如此,当你使用一个不接受文件名为输入参数的命令,而需要的输入又是在一个已存在的文件里时,你就能用输入重定向解决问题。

输出重定向

  输出重定向比输入重定向更常用。

输出重定向使你能把一个命令的输出重定向到一个文件里,而不是显示在屏幕上。

  很多情况下都可以使用这种功能。

例如,如果某个命令的输出很多,在屏幕上不能完全显示,你能把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件;当你想保存一个命令的输出时也可以使用这种方法。

还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入时。

(还有一种更简单的方法可以把一个命令的输出当作另一个命令的输入,就是使用管道,管道的使用将在本文的“管道”一节介绍)

  输出重定向的使用与输入重定向很相似,但是输出重定向的符号是>;。

--------------------------------------------------------------------------------

  注意:

记忆输入/输出重定向符号的最好方法是把<看作是一个漏斗,漏斗的小口        指向需要输入的命令(因为需要接受输入的命令会在<的左手边),而把>;        当作一个大口指向有输出的命令的漏斗。

--------------------------------------------------------------------------------

  重定向举例,当你要把ls命令的输出保存为一个名为directory.out的文件时

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2