什么是shell

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

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

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

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

shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是 购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列 表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解 为系统调用并传给Linux内核。

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

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

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

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

用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell 脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为 运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来说,用户可以 有许多 shell,每个shell都是由某个shell(称为父shell)派生的。

在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该 脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输 出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。

UNIX 命令有内部命令和外部命令之分。内部命令实际上是shell程序的一部分,其中包含的是一些比较简练的UNIX系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在UNIX系统加载运行时shell就被加载并驻留在系统内存中。外部命令是UNIX系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以它们包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调进内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell 程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。内部命令要比外部命令的反应时间快一些,内部命令不用启动一个子shell来运行。

查看shell内部命令:[...]#man builtins

判断某命令是否是内部命令:[...]#type -a command

[...]#command --help   查看外部命令的帮助文件

[...]#help command     查看内部命令的帮助文件

转载于:https://blog.51cto.com/tanghuimin0713/755532

shell内部命令和外部命令相关推荐

  1. Linux shell 内部命令与外部命令有什么区别以及怎么辨别

    内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...

  2. adb shell查看进程提示grep不是内部命令或外部命令解决办法

    1.根据包名查看进程命令adb shell  ps|grep  com.ott.android.TMC(包名) 直接输入会提示grep不是内部命令或外部命令解决办法,解决办法加上引号adb shell ...

  3. 【已解决】adb shell查看进程提示grep不是内部命令或外部命令

    1. 问题 adb shell查看进程提示grep不是内部命令或外部命令 2. 解决办法 把adb shell 后面的语句加上引号即可 adb shell "dumpsys activity ...

  4. 【批处理DOS-CMD命令-汇总和小结】-cmd的内部命令和外部命令怎么区分,CMD命令和运行(win+r)命令的区别,cmd的命令扩展(扩展命令)

    一.cmd的内部命令和外部命令怎么区分? 区分规则很简单,在cmd窗口中用help命令能打印出来的命令都是cmd内部命令,没包括在里面的都是外部命令. D:\>help 有关某个命令的详细信息, ...

  5. shall 内部命令 和 外部命令

    UNIX 命令有内部命令和外部命令之分.内部命令 实际上是shell程序的一部分,其中包含的是一些比较简练的UNIX系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在UNIX ...

  6. Linux中内部命令和外部命令

    exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...

  7. ‘net’ 不是内部命令或外部命令,也不是可运行的程序或批处理文件 解决方法

    'net' 不是内部命令或外部命令,也不是可运行的程序或批处理文件 解决方法 参考文章: (1)'net' 不是内部命令或外部命令,也不是可运行的程序或批处理文件 解决方法 (2)https://ww ...

  8. 'npm'不是内部命令或外部命令的解决办法

    在安装node的时候在cmd中输入npm -v进行检验,结果返回了'npm'不是内部命令或外部命令. 1.打开系统属性,进入高级 2.点击环境变量 3.创建新路径(路径为node的安装路径) 4.重新 ...

  9. sc不是内部命令或外部命令

    通过mysql黑窗口命令 "sc delete 服务名" 删除mysql服务时系统报错:sc不是内部命令或外部命令 原因:系统默认环境变量值发生变化: 解决:点击我的电脑--> ...

最新文章

  1. CI框架如何删除地址栏的 index.php
  2. Discovering versions from the identity service failed when creating the password plugin.
  3. checkbox全选和反选功能
  4. 三次Hermite插值
  5. 牛头刨床机构动力学的分析(C语言建模)
  6. 移动硬盘拒绝访问问题解决方法
  7. cd40系列芯片_CD40,CD45系列芯片功能大全
  8. 想长胖的人看过来,几招教你变胖|猎人营
  9. 模模搭古城搭建学习笔记2:基础设施篇
  10. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)
  11. 返回多字段并用数组分割方式展示
  12. Roman to Integer/Integer to Roman
  13. 订阅号微信公众号历史文章爬虫php,2019.9月最新爬取微信公众号历史文章的办法...
  14. 基于ESP8266+华为云数据监控模块
  15. 数据库(一)——数据库的基本使用
  16. 管理学原理 【1049】
  17. 什么是证书透明度(Certificate Transparency,CT)?
  18. 【AWS云从业者基础知识笔记】——模块5:存储和数据库
  19. Windows 系统错误193: 0xc1
  20. 批处理文件删除注册表数据

热门文章

  1. Android开发环境搭建Eclipse+JDK+ADT+AVD(系列一)
  2. [wp7游戏]wp7~~超级血腥类游戏~~集合贴~~
  3. datetime类型保存的时间比实际时间少8小时
  4. Hadoop编译打包记录
  5. easyUI的combobox的实现
  6. C# WPF动态删除指定类型控件
  7. 西北大学集训队选拔赛 F-三生三世(STL set和map的简单应用)
  8. Day12-BigDecimal笔记及练习
  9. JDK的下载、安装和配置
  10. 海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践 1