Linux操作系统基础解析之(七)——bash基础知识和基本使用技巧(1)

在日常交际英语中,Shell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构。在计算机科学中,shell其实是指:为操作者提供的、能够通过系统调用或库调用使用整个计算机资源的访问接口。
    它既是一种命令解析器又是一种程序设计语言。作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令;作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支,让我们可以像使用高级语言那样去使用shell,使之能够胜任复杂逻辑环境的应用,提高其执行效率,更容易发挥其自动化的特性。

与前面的内容相似的,还有下列两个概念:交互式shell和非交互式shell
    交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、注销登录。当你注销登录后,shell将终止运行。
    shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

在"UNIX Like"中主要的shell类型有:
        1. Bourne shell (sh)
        2. Korn shell (ksh)
        3. Bourne Again shell (bash)
        4. POSIX shell (sh)
        5. C shell (csh)
        6. TENEX/TOPS C shell (tcsh)

=============================================================
Bourne Shell
首个重要的标准Unix Shell是1970年底在V7 Unix(AT&T第7版)中引入的,并且以它的创始科技部基础条件平台——“国家气象网络计算应用节点建设”(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。

C Shell
Bill Joy于20世纪80年代早期,在伯克利的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。

Korn Shell
有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的Bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell是一个交互式的命令解释器和命令编程语言.它符合POSIX标准(Portable Operating System,一个操作系统的国际标准)。但POSIX其实并不是一个操作系统(本来应被称为POS标准,但后来为了迎合UNIX,而特别的在POS后面增加了IX后缀,故而称为了POSIX标准),而是一个目标在于方便应用程序的移植的标准,使得应用程序在源程序级别实现跨多种平台编译称为可能。

Bourne Again Shell (bash)
bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash,因为sh不过是bash的一个符号链接罢了。

POSIX Shell
POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh。
=============================================================

注:"="标记中的内容为网络转载。

bash是大多数Linux系统以及Mac OS X默认的shell,它能运行于大多数Unix类操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。
bash的命令语法是Bourne shell(简称sh)命令语法的超集。数量庞大的sh脚本通常可以不经修改而直接在bash中执行,除了那些使用了sh的特殊变量或内置命令的脚本才需要修改。bash的命令语法很多来自Korn shell(ksh)和C shell(csh),例如命令行编辑,命令历史,目录栈,$RANDOM和$PPID变量,以及POSIX的命令替换语法: $(...)。

对于任何一款Linux发行版操作系统而言,bash不过就是一个应用程序而已,只不过这个应用程序十分特殊罢了。而在Linux中,对于bash自身而言,它就是一个外部命令而已。下面我们简单来看看这个外部命令的作用吧。
bash:外部命令,命令二进制文件存放的路径为:/bin/bash,全称为:GNU Bourne-Again SHell
使用格式:bash [options] [file]
命令描述:
    Bash是一种sh兼容的,可以从标准输入或文件中读取并执行命令的命令语言解释程序。Bash也融合了Korn和C shell的一些有用的特性。
    Bash是一种一致性实现的Shell和遵循IEEE POSIX规范的实用工具。默认的,bash被配置为与POSIX一致。

常用选项:
  -x:调试执行命令或脚本,详细显示执行的过程和返回的执行结果。
  -n:检查命令或脚本内是否存在语法错误。
 
    既然shell是如此的重要而且也是如此的不可或缺,那么我们应该如何使用shell呢?其实很简单,想要学会使用shell就必须要了解shell给操作者提供了哪些功能特性。

下面就以bash为例,介绍一下它的基本功能特性:
一、命令解释:
    这个功能特性可以说是任何一种shell或者会所任何一款接口程序所必须具备的基本功能,甚至应该说是其与生俱来的使命了。
    那么bash是如何解释命令的呢?
      1.在bash中,只有键入了回车,bash才去试图解释命令;
      2.在键入回车之后,bash尝试着将整个命令行的内容按照空白字符分段,bash会认为最左侧的一段就是要执行的命令;
      3.bash在确定了可能是命令的字符串之后,需要知道这是内部命令还是外部命令。所谓内部命令,就是指bash自带的命令,这样的命令通常是在bash运行起来之后就被载入内存了,因为这样的命令就是bash的一部分;所谓的外部命令,就是通过安装其他应用程序存储在外部存储器某些数据块里面的命令,与bash并没有什么直接的关系。如果本次执行的是内部命令,bash可以直接运行,然后返回执行结果和执行状态信息;如果本次执行的不是内部命令,bash就会调用内置的保存了可执行二进制文件的路径的PATH变量,读取变量中的内容,从中查找是否有与本次执行的命令相同名称的文件,如果有就执行之,如果没有,就会报告错误信息,诸如:-bash: COMMAMD: command not found。其中的"COMMAND"可能会被替换为执行的命令。如下例所示:

    [[email protected] ~]# sss
    -bash: sss: command not found

4.bash判断出命令类型并给予解释的时候,整个命令行中的其他字段,会被当作选择以及参数送给命令,如果都正确,则说明此命令可以正确执行,bash会按照命令要求的格式将此次命令的执行结果输出至标准输入;但如果这样的选项或参数不正确或者不能使用,则还需要按照以下两种情况对待:
        1)如果是内部命令,bash会一直负责到底,帮助该命令报告错误信息;
        2)如果是外部命令,就不是bash可以决定的了,通常这个时候,会由被执行的应用程序来判断选项和参数是否正确,如果不正确,会由应用程序来报告错误信息。
        3)无论是内部命令还是外部命令,就算是外部命令也是由bash启动的,所以bash得对此命令是否能够成功执行、是否正常退出负责。在执行结束的时候,bash都要使用一个退出代码标识其执行的状态信息,并将该状态信息保存至一个名为"?"的特殊变量中。如果想要查看这个状态之,我们可以使用一般的变量内容的读取方法:echo $? 即可。通常来讲,这样的命令执行状态的返回值是由0-255的整数来表示,其中:
        (1) 0:表示命令执行成功
        
(2) 1、2、127:为bash默认的错误代码
        
(3) 3-126:为用户可自定义的错误代码
        
(4) 128-255:某个命令非正常退出,而是由于接收到了某个信号才退出,这样的状态返回值为128+N,其中的"N"就表示命令接收到的信号的编号

请参考下面的例子:

  [[email protected] ~]# cd -a            
  -bash: cd: -a: invalid option
  cd: usage: cd [-L|-P] [dir]

(此处为内部命令的选项错误)

  [[email protected] ~]# cd /testtt    
  -bash: cd: /testtt: No such file or directory

  (此处为内部命令的参数错误)

  [[email protected] ~]# echo $?        
  1

(此处为命令执行的状态返回值。一般情况下,若该返回值为"0"则表示命令成功执行,否则即为命令执行失败)

  [[email protected] ~]# ls --P        
  ls: unrecognized option ‘--P‘
  Try `ls --help‘ for more information.

(此处为外部命令的选项错误)

  [[email protected] ~]# ls /testtt        
  ls: cannot access /testtt: No such file or directory

(此处为外部命令的参数错误)

  [[email protected] ~]# echo $?        
  2

(此处为外部命令执行的状态返回值。一般情况下,若该返回值为"0"则表示命令成功执行,否则即为命令执行失败)

二、命令别名
  bash给我们提供了给命令建立别名的特权,不管是系统管理员也好,普通用户也好,都可以定义别名命令,而且定义的方法非常简单:
    1.可以使用alias命令来定义别名命令;
   
2.可以使用unalias命令取消已经定义的别名命令;
   
3.无论是使用alias命令定义还是unalias命令来取消,都是改了内存中的bash运行参数,因此只要bash关闭,该功能就失效了。因此,为了能够让别名命令永久有效,可以将这样的定义内容写在家目录中的.bashrc文件中,每个用户家里面都有这个文件,童叟无欺。
  这个特性在有些时候会非常有用,因为依靠这个特性,我们可以:
    1.将复杂的命令简单化,如:

  [[email protected] ~]# alias l.=‘ls -d .* --color=auto‘    
  [[email protected] ~]# alias ll=‘ls -l --color=auto‘
  [[email protected] ~]# alias ls=‘ls --color=auto‘

2.将危险的命令安全化,如:

  [[email protected] ~]# alias cp=‘cp -i‘        
  [[email protected] ~]# alias mv=‘mv -i‘
  [[email protected] ~]# alias rm=‘rm -i‘

3.根据自己的喜好和使用习惯来定义不同风格的命令,如:

  [[email protected] ~]# alias cdnet=‘cd /etc/sysconfig/network-scripts/‘    
  [[email protected] ~]# alias viht=‘vim /etc/httpd/conf/httpd.conf‘

(待续...)

时间: 2024-12-28 16:17:26

Linux操作系统基础解析之(七)——bash基础知识和基本使用技巧(1)的相关文章

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(1)

在日常交际英语中,Shell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构.在计算机科学中,shell其实是指:为操作者提供的.能够通过系统调用或库调用使用整个计算机资源的访问接口. 它既是一种命令解析器又是一种程序设计语言.作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令:作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支,让我们可以像使用高级语言

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(3)

五.注释 在非交互shell中或交互式shell中,内置命令shopt的选项interactive_comments被开启.以"#"开始的词使得这个词所在这一行上所有其他的剩余字符都被忽略(或称注释).交互式shell不用开启interactive_comments选项也不支持注释.interactive_comments选项在交互式shell中是默认启用的.注释是编写程序时,写程序的人给一个语句.程序段.函数等的解释或提示,能提高程序代码的可读性,以便于以后的参考.修改.后来,在应用

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(5)

十一.函数  shell函数就是按照上面SHELL GRAMMAR的描述定义的保存着一系列等待稍后执行的命令.当shell函数名被当做一个简单命令名使用时,被这个函数名关联的一系列命令都被执行.函数在当前shell的上下文环境中被执行:不会创建新的进程来解释它们(这与shell脚本的执行形成了对比).当执行函数时,函数的参数成为执行过程中的位置参数.特殊参数#被更新以反映这个变化.特殊参数0不会改变.函数执行时,FUNCNAME变量的第一个元素被设置为函数的名称.  shell执行环境的所有其他

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(4)

九.展开 命令行的展开是在拆分成词之后进行的.有七种类型的展开:花括号展开,波浪线展开,参数和变量展开,命令替换,算术展开,分行成词,路径展开. 展开的顺序是:花括号展开,波浪线展开,参数和变量展开,命令替换,算术展开,分行成词,路径展开,按照从左到右的顺序展开. 在系统上还有一种可用的额外的展开:进程替换. 只有花括号展开,分行成词和路径展开在展开前后的词数会发生改变:其他展开总是将一个词展开为一个词. 唯一的例外是上面提到的"[email protected]"和"${n

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(2)

三.命令历史bash从Korn Shell和C Shell中吸收了很多的精华,其中之一正式为已经执行过的命令保存一个缓存副本的特性,我们称之为"命令历史"功能.我们为什么要使用命令历史功能呢?每个用户登录成功之后,尤其是使用bash这样的文件接口登录之后,所有的操作都是由执行命令来实现的,那么就不可避免的会出现重复执行某个命令的情况,如果每个命令都依靠键入的方式来输入的话,固然没有问题,但是效率不高而且也是浪费时间的"可耻"行为,命令历史刚好给我们提供了解决这种问题

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(6)

SHELL BUILTIN COMMANDS  除非另外说明,内置命令如果接受由-引导的选项,那么它也接受--,来表示选项的结束.内置命令:,true,false和test不接受选项并且尤其不处理--引导的选项.内置命令exit,logout,break,continue,let和shift接受和处理以-开头的参数不需要以--开头的.其他接受参数但是不能接受特定选项的内置命令解释以-作为无效选项开头的参数并且需要--来阻止这样的解释.    : [arguments]      没有效果:这个命

Java基础学习笔记七 Java基础语法之继承和抽象类

继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工,程序中便可以描述为研发部员工和维护部员工继承自员工,同理,JavaEE工程师和Android工程师继承自研发部员工,而维网络维护工程师和硬件维护工程师继承自维护部员工.这些员工之间会形成一个继承体系,具体如下图所示. 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称

java基础解析系列(十一)---equals、==和hashcode方法

java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及装箱拆箱 java基础解析系列(三)---HashMap原理 java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 j

操作系统 Linux操作系统编程开发

Linux操作系统编程开发 预备知识: 1.进程操作:Linux系统是多任务的操作系统,采用进程作为任务调度的单位,进程在Linux系统下的概念是程序代码的一次执行,包括运行的代码和运行需要的数据.参数等资源. 2.进程和程序的区别:一方面:在Linux系统下,进程是程序代码的执行,所以程序是一段运行的,有生命力的程序,是一个动态的概念:一个程序是指储存在磁盘或者其他存储介质中的静态代码.另一方面:一个进程是基于一个程序运行的,而一个程序可以被重复载入到内存,形成多个进程! 3.CPU时间片(L