唐山网站建设

设为主页 加入收藏 繁體中文

Linux主要shell命令详解

核心提示:shell是用户和Linux操纵系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的1般操纵及Bash的特性。

  shell是用户和Linux操纵系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的1般操纵及Bash的特性。
  甚么是shell

  Linux系统的shell作为操纵系统的外壳,为用户提供使用操纵系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。

  shell是用户和Linux内核之间的接口程序,假设把Linux内核想象成1个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

  shell是1个命令语言解释器,它具有自己内建的shell命令集,shell也能被系统中其他利用程序所调用。用户在提示符下输进的命令都由shell先解释然后传给Linux核心。

  有1些命令,比如改变工作目录命令cd,是包括在shell内部的。还有1些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,没必要关心1个命令是建立在shell内部还是1个单独的程序。

  shell首先检查命令是否是是内部命令,若不是再检查是否是是1个利用程序(这里的利用程序可以是Linux本身的实用程序,如ls和rm,也能够是购买的贸易程序,如xv,或是自由软件,如emacs)。然后shell在搜索路径里寻觅这些利用程序(搜索路径就是1个能找到可履行程序的目录列表)。假设键进的命令不是1个内部命令并且在路径里没有找到这个可履行文件,将会显示1条毛病信息。假设能够成功找到命令,该内部命令或利用程序将被分解为系统调用并传给Linux内核。
 
  shell的另1个重要特性是它本身就是1个解释型的程序设计语言,shell程序设计语言支持尽大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键进的命令都能放到1个可履行的shell程序中。

  当普通用户成功登录,系统将履行1个称为shell的程序。正是shell进程提供了命令行提示符。作为默许值(TurboLinux系统默许的shell是BASH),对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。

  1旦出现了shell提示符,便可以够键进命令名称及命令所需要的参数。shell将履行这些命令。假设1条命令花费了很长的时间来运行,或在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它(在正常结束之前,中断它的履行)。

  当用户豫备结束登录对话进程时,可以键进logout命令、exit命令或文件结束符(EOF)(按ctrl+d实现),结束登录。

  我们来实习1下shell是如何工作的。

  $ make work

  make:***No rule to make target ‘work’. Stop.

  $

  注释:make是系统中1个命令的名字,后面随着命令参数。在接收到这个命令后,shell便履行它。本例中,由于输进的命令参数不正确,系统返回信息后停止该命令的履行。

  在例子中,shell会寻觅名为make的程序,并以work为参数履行它。make是1个常常被用来编译大程序的程序,它以参数作为目标来进行编译。在 “make work”中,make编译的目标是work。由于make找不到以work为名字的目标,它便给出毛病信息表示运行失败,用户又回到系统提示符下。

  另外,用户键进有关命令行后,假设shell找不到以其中的命令名为名字的程序,就会给出毛病信息。例如,假设用户键进:

  $ myprog

  bash:myprog:command not found

  $

  可以看到,用户得到了1个没有找到该命令的毛病信息。用户敲错命令后,系同1般会给出这样的毛病信息。

  shell的种类

  Linux中的shell有多种类型,其中最常常使用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。3种shell各有优缺点。Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操纵系统缺省的shell是Bourne Again shell,它是Bourne shell的扩大,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有很多特点,可以提供如命令补全、命令编辑和命令历史表等功能,它还包括了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

  C shell是1种比Bourne shell更适于编程的shell,它的语法与C语言很类似。 Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的1个扩大版本。Tcsh包括命令行编辑、可编程单词补全、拼写校订、历史命令替换、作业控制和类似C语言的语法,它不但和Bash shell是提示符兼容,而且还提供比Bash shell更多的提示符参数。

  Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux系统提供了pdksh(ksh的扩大),它支持任务控制,可以在命令行上挂起、后台履行、唤醒或终止程序。

  Linux并没有冷落其他shell用户,还包括了1些流行的shell如ash、zsh等。每个shell都有它的用处,有些shell是有专利的,有些能从Internet网上或其他来源取得。要决定使用哪个shell,只需读1下各种shell的联机帮助,并试用1下。

  用户在登录到Linux时由/etc/passwd文件来决定要使用哪个shell。例如:

  # fgrep lisa /etc/passwd

  lisa:x:500:500:TurboLinux User:/home/lisa:/bin/bash

  shell被列每行的末尾(/bin/bash)。

  由于Bash是Linux上缺省的shell,本章主要先容Bash及其相干知识。

  shell命令

  命令行c

  用户登录到Linux系统时,可以看到1个shell提示符,标识了命令行的开始。用户可以在提示符后面输进任何命令及参数。例如:

  $ date

  2 11 23 01:34:58 CST 1999

  $

  用户登录时,实际进进了shell,它遵守1定的语法将输进的命令加以解释并传给系统。命令行中输进的第1个字必须是1个命令的名字,第2个字是命令的选项或参数,命令行中的每个字必须由空格或TAB隔开,格式以下:

  $ Command Option Arguments

  1. 选项和参数

  选项是包括1个或多个字母的代码,它前面有1个减号(减号是必要的,Linux用它来辨别选项和参数),选项可用于改变命令履行的动作的类型。例如:

  $ ls

  motd passwd

  $

  这是没有选项的ls命令,可列出当前目录中所有文件,只列出各个文件的名字,而不显示其他更多的信息。

  $ ls -l

  total 2

  -rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd

  -rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd

  $

  加进-l选项,将会为每个文件列出1行信息,诸如数据大小和数据最后被修改的时间。

  大多数命令都被设计为可以接纳参数。参数是在命令行中的选项以后键进的1个或多个单词,例如:

  $ ls -l text

  -rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd

  -rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd

  $

  将显示text目录下的所有文件及其信息。

  有些命令,如ls可以带参数,而有1些命令可能需要1些最小数目的参数。例如,cp命令最少需要两个参数,假设参数的数目与命令要求不符,shell将会给出出错信息。例如:

  $ cp -i mydata newdata

  留意:命令行当选项先于参数输进。

  2. 命令行特点

  命令行实际上是可以编辑的1个文本缓冲区,在按回车之前,可以对输进的文本进行编辑。比如利用BACKSPACE键可以删除刚键进的字符,可以进行整行删除,还可以插进字符,使得用户在输进命令,特别是复杂命令时,若出现键进毛病,不必重新输进全部命令,只要利用编辑操纵,即可改正毛病。

  利用上箭头可以重新显示刚履行的命令,利用这1功能可以重复履行之前履行过的命令,而不必重新键进该命令。

  bash保存着之前键进过的命令的列表,这1列表被称为命令历史表。按动上箭头,即可以在命令行上逐次显示各条命令。一样,按动下箭头可以在命令列表中向下移动,这样可以将之前的各条命令显示在命令行上,用户可以修改并履行这些命令。这1特点将在10.4节中进行具体的论述。

  在1个命令行中还可以置进多个命令,用分号将各个命令隔开。例如:

  $ ls -F;cp -i mydata newdata

  也能够在几个命令行中输进1个命令,用反斜杠将1个命令行延续到下1行。

  $ cp –i

  mydata

  newdata

   

  上面的cp命令是在3行中输进的,开始的两行以反斜杠结束,把3行作为1个命令行。

  shell中的特殊字符

  shell中除使用普通字符外,还可使用1些具有特殊含义和功能的特殊字符。在使用它们时应留意其特殊的含义和作用范围。下面分别对这些特殊字符加以先容。

  1. 通配符

  通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常常使用的通配符有*、?和括在方括号[ ]中的字符序列。用户可以在作为命令参数的文件名中包括这些通配符,构成1个所谓的“模式串”,在履行进程中进行模式匹配。

  * 代表任何字符串(长度可以不等),例如:“f*”匹配以f打头的任意字符串。但应留意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。

  ? 代表任何单个字符。

  [] 代表指定的1个字符范围,只要文件名中[]位置处的字符在[]中指定的范围之内,那末这个文件名就与这个模式串匹配。方括号中的字符范围可以由直接给出的字符组成,也能够由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。例如,f [a- d] 与f [abcd]的作用相同。Shell将把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,构成终极的命令,然后再履行这个命令。

  下面我们给出表10⑴说明这些通配符的具体含义。

  表10⑴ 通配符含义举例

  模式串

  意 义

  *

  当前目录下所有文件的名称。

  *Text*

  当前目录下所有文件名中包括有Text的文件的名称。

  [ab-dm]*

  当前目录下所有以a、b、c、d、m开头的文件的名称。

  [ab-dm]?

  当前目录下所有以a、b、c、d、m开头且后面只跟有1个字符的文件的名称。

  /usr/bin/??

  目录/usr/bin下所着名称为两个字符的文件的名称。

  特别需要留意的是,连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就成为普通字符了。而*和?只在方括号外面是通配符,若出现在方括号之内,它们也失往通配符的能力,成为普通字符了。例如,模式“- a[*?]abc”中只有1对方括号是通配符,*和?均为普通字符,因此,它匹配的字符串只能是- a*abc和- a?abc。

  最后说明1下使用通配符时需要留意的1些题目。由于*、?和[]对shell来讲具有比较特殊的意义,因此在正常的文件名中不应出现这些字符。特别是在目录名中不要出现它们,否则Shell匹配起来可能会无穷的递回下往。另外要留意的1点是:假设目录中没有与指定的模式串相匹配的文件名,那末Shell 将使用此模式串本身作为参数传给有关命令。这可能就是命令中出现特殊字符的缘由所在。

  2. 引号

  在shell中引号分为3种:单引号,双引号和反引号。

  * 单引号 ‘

  由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失往原故意义,而只作为普通字符解释。例如:

  $ string=’$PATH’

  $ echo $string

  $PATH

  $

  可见$保持了其本身的含义,作为普通字符出现。

  * 双引号 “

  由双引号括起来的字符,除$、、’、和”这几个字符还是特殊字符并保存其特殊功能外,其余字符仍作为普通字符对待。对$来讲,就是用其后指定的变量的值来代替这个变量和$;对而言,是转义字符,它告知shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上的只有4个字符$,,’和”本身。而对”号,若其前面没有加,则Shell会将它同前1个”号匹配。

  例如,我们假定PATH的值为.:/usr/bin:/bin,输进以下命令:

  $ TestString=”$PATH”$PATH”

  $ echo $TestString

  .:/usr/bin:/ bin”$PATH

  $

  读者可以自己试1下在第2个双引号之前不加会产生甚么结果。

   

  * 反引号 `

  反引号(`)这个字符所对应的键1般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在履行时,shell首先履行该命令行,并以它的标准输出结果取代全部反引号(包括两个反引号)部份。例如:

  $ pwd

  /home/xyz

  $ string=”current directory is `pwd`”

  $ echo $string

  current directour is /home/xyz

  $

  shell履行echo命令时,首先履行`pwd`中的命令pwd,并将输出结果/home/xyz取代`pwd`这部份,最后输出替换后的全部结果。

  利用反引号的这类功能可以进行命令置换,即把反引号括起来的履行结果赋值给指定变量。例如:

  $ today=`date`

  $ echo Today is $today

  Today is Mon Apr 15 16:20:13 CST 1999

  $

  反引号还可以嵌套使用。但需留意,嵌套使用时内层的反引号必须用反斜线()将其转义。例如:

  $ abc=`echo The number of users is `who| wc-l``

  $ echo $abc

  The number of users is 5

  $

  在反引号之间的命令行中也能够使用shell的特殊字符。Shell为得到``中命令的结果,它实际上要往履行``中指定的命令。履行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且``所包括的可以是任何1个正当的Shell命令,如:

  $ ls

  note readme.txt Notice Unix.dir

  $ TestString=”`echo $HOME ` ` ls [nN]*`”

  $ echo $TestString

  /home/yxz note Notice

  $

  其他情况,读者可自行试之。

  1. 注释符

  在shell编程中常常要对某些正文行进行注释,以增加程序的可读性。在Shell中以字符“#”开头的正文行表示注释行。

  另外还有1些特殊字符如:用于输进/输出重定向与管道的<、>、<<、> >和|;履行后台命令的&;命令履行操纵符&&和||及表示命令组的{}将在下面各小节中加以先容。

   标准输进/输出和重定向

  1. 标准输进与输出

  我们知道,履行1个shell命令行时通常会自动打开3个标准文件,即标准输进文件(stdin),通常对应终真个键盘;标准输出文件(stdout)和标准毛病输出文件(stderr),这两个文件都对应终真个屏幕。进程将从标准输进文件中得到输进数据,将正常输出数据输出到标准输出文件,而将毛病信息送到标准毛病文件中。

  我们以cat命令为例,cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用以下命令:

  $ cat config

  将会把文件config的内容顺次显示到屏幕上。但是,假设cat的命令行中没有参数,它就会从标准输进中读取数据,并将其送到标准输出。例如:

  $ cat

  Hello world

  Hello world

  Bye

  Bye

  <ctrl+d>

  $

  用户输进的每1行都立即被cat命令输出到屏幕上。

  另1个例子,命令sort按行读进文件正文(当命令行中没有给出文件名时,表示从标准输进读进),将其排序,并将结果送到标准输出。下面的例子是从标准输进读进1个采购单,并将其排序。

  $ sort

  bananas

  carrots

  apples

  <ctrl+d>

  apples

  bananas

  carrots

  $

  这时候我们在屏幕上得到了已排序的采购单。

  直接使用标准输进/输出文件存在以下题目:

  输进数据从终端输进时,用户费了半天劲输进的数据只能用1次。下次再想用这些数据时就得重新输进。而且在终端上输进时,若输进有误修改起来不是很方便。

  输出到终端屏幕上的信息只能看不能动。我们没法对此输出作更多处理,如将输出作为另1命令的输进进行进1步的处理等。

  为了解决上述题目,Linux系统为输进、输出的传送引进了另外两种机制,即输进/输出重定向和管道。

  2. 输进重定向

  输进重定向是指把命令(或可履行程序)的标准输进重定向到指定的文件中。也就是说,输进可以不来自键盘,而来自1个指定的文件。所以说,输进重定向主要用于改变1个命令的输进源,特别是改变那些需要大量输进的输进源。

  例如,命令wc统计指定文件包括的行数、单词数和字符数。假设仅在命令行上键进:

  $ wc

  wc将等待用户告知它统计甚么,这时候shell就好象死了1样,从键盘键进的所有文本都出现在屏幕上,但并没有甚么结果,直至按下<ctrl+d>,wc才将命令结果写在屏幕上。

  假设给出1个文件名作为wc命令的参数,以下例所示,wc将返回该文件所包括的行数、单词数和字符数。

  $ wc /etc/passwd

  20 23 726 /etc/passwd

  $

  另1种把/etc/passwd文件内容传给wc命令的方法是重定向wc的输进。输进重定向的1般情势为:命令<文件名。可以用下面的命令把wc命令的输进重定向为/etc/passwd文件:

  $ wc < /etc/passwd

  20 23 726

  $

  另1种输进重定向称为here文档,它告知shell当前命令的标准输进来自命令行。here文档的重定向操纵符使用<<。它将1对分隔符(本例中用delim表示)之间的正文重定向输进给命令。下例将1对分隔符delim之间的正文作为wc命令的输进,统计出正文的行数、单词数和字符数。

  $ wc<<delim

  >this text forms the content

  >of the here document,which

  >continues until the end of

  >text delimter

  >delim

  4 17 98

  在<<操纵符后面,任何字符都可以作为正文开始前的分隔符,本例中使用delim作为分隔符。here文档的正文1直延续到遇见另1个分隔符为止。第2个分隔符应出现在新行的开头。这时候here文档的正文(不包括开始和结束的分隔符)将重新定向送给命令wc作为它的标准输进。

  由于大多数命令都以参数的情势在命令行上指定输进文件的文件名,所以输进重定向其实不常常使用。虽然如此,当要使用1个不接受文件名作为输进参数的命令,而需要的输进内容又存在1个文件里时,便可以用输进重定向解决题目。

  1. 输出重定向

  输出重定向是指把命令(或可履行程序)的标准输出或标准毛病输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写进到指定文件中。

  输出重定向比输进重定向更常常使用,很多情况下都可使用这类功能。例如,假设某个命令的输出很多,在屏幕上不能完全显示,那末将输出重定向到1个文件中,然后再用文本编辑器打开这个文件,便可以够查看输出信息;假设想保存1个命令的输出,也能够使用这类方法。还有,输出重定向可以用于把1个命令的输出当作另1个命令的输进(还有1种更简单的方法,就是使用管道,将在下面先容)。

  输出重定向的1般情势为:命令>文件名。例如:

  $ ls > directory.out

  $ cat directory.out

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

  $

  将ls命令的输出保存为1个名为directory.out的文件。

  注:假设>符号后边的文件已存在,那末这个文件将被重写。

  为避免输出重定向中指定文件只能寄存当前命令的输出重定向的内容,shell提供了输出重定向的1种追加手段。输出追加重定向与输出重定向的功能非常类似,辨别仅在于输出追加重定向的功能是把命令(或可履行程序)的输出结果追加到指定文件的最后,而该文件原有内容不被破坏。

  假设要将1条命令的输出结果追加到指定文件的后面,可使用追加重定向操纵符>>。情势为:命令>>文件名。例如:

  $ ls *.doc>>directory.out

  $ cat directory.out

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

  ch1.doc ch2.doc ch3.doc

  $

  和程序的标准输出重定向1样,程序的毛病输出也能够重新定向。使用符号2>(或追加符号2>>)表示对毛病输出设备重定向。例以下面的命令:

  $ ls /usr/tmp 2> err.file

  可在屏幕上看到程序的正常输出结果,但又将程序的任何毛病信息送到文件err.file中,以备将来检查用。

  还可使用另1个输出重定向操纵符(&>)将标准输出和毛病输出同时送到同1文件中。例如:

  $ ls /usr/tmp &> output.file

  利用重定向将命令组合在1起,可实现系统单个命令不能提供的新功能。例如使用下面的命令序列:

  $ ls /usr/bin > /tmp/dir

  $ wc –w < /tmp/dir

  459

  统计了/usr/bin目录下的文件个数。

  管 道

  将1个程序或命令的输出作为另1个程序或命令的输进,有两种方法,1种是通过1个临时文件将两个命令或程序结合在1起,例如上个例子中的/tmp/dir文件将ls和wc命令联在1起;另1种是Linux所提供的管道功能。这类方法比前1种方法更好。

  管道可以把1系列命令连接起来,这意味着第1个命令的输出会作为第2个命令的输进通过管道传给第2个命令,第2个命令的输出又会作为第3个命令的输进,以此类推。显示在屏幕上的是管道行中最后1个命令的输出(假设命令行中未使用输出重定向)。

  通过使用管道符“|”来建立1个管道行。用管道重写上面的例子:

  $ ls /usr/bin|wc -w

  1789

  再如:

  $ cat sample.txt|grep "High"|wc -l

  管道将cat命令(列出1个文件的内容)的输出送给grep命令。grep命令在输进里查找单词High,grep命令的输出则是所有包括单词High的行,这个输出又被送给wc命令,wc命令统计出输进中的行数。假定sample.txt文件的内容以下:

  Things to do today:

  Low:Go grocery shopping

  High:Return movie

  High:Clear level 3 in Alien vs. Predator

  Medium:Pick up clothes from dry cleaner

  那末该管道行的结果是2。

  命令替换

  命令替换和重定向有些类似,但辨别在于命令替换是将1个命令的输出作为另外1个命令的参数。常常使用命令格式为:

  command1 `command2`

  其中,command2的输出将作为command1的参数。需要留意的是这里的`符号,被它括起来的内容将作为命令履行,履行后的结果作为command1的参数。例如:

  $ cd `pwd`

  该命令将pwd命令列出的目录作为cd命令的参数,结果依然是停留在当前目录下

唐山网站建设www.fw8.net


TAG:程序,参数,文件,命令,字符
评论加载中...
内容:
评论者: 验证码: