Linux内建命令和外部命令

时间:2023-01-05 13:39:36

Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。

【内部命令 vs. 外部命令】

(1)内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等。常见的内部命令详细见:bash内部命令 - koko7958的专栏 - 博客频道 - CSDN.NET

(2)外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/sbin等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。

(3)type命令可以分辨内部命令与外部命令

常用的三个参数:-t对应-type,-a对应-all,-p对应-path,使用:type [-a | -t | -p] name 或 type [-all | -type | -path] name

命令与系统调用】

通常情况下,脚本中的Bash内建命令在运行的时候是不会fork出一个子进程的。但是脚本中的外部或者过滤命令通常会fork出一个子进程。 一个内建命令通常会与一个系统命令同名,但是Bash在内部重新实现了这些命令。比如,Bash的echo命令与/bin/echo就不尽相同,虽然它们的行为在绝大多数情况下都是一样的。

例如ls命令,如果是内建命令的话应该会引起fork()和exec()这两个系统调用,具体的步骤可以参考:ls命令是怎样实现的,getdents64,linux-2.6.27.5 - 小默 - C++博客,大致的思路就应该是去读取当前文件夹的目录项来获得该目录下的所有文件名。

其他的命令没有研究过,望研究过的人提示一下。

【命令与环境变量】

以pwd命令为例子说明:

(1)pwd命令用于显示当前工作目录,也可以使用pwd命令来判断目录在文件系统内的位置。pwd指令主要跟三个环境变量:PATH、OLDPWD、PWD有关。

PATH—执行文件的路径。使用"echo $PATH"显示PATH的内容(PATH前面加$表示后面接的是变量),下同;OLDPWD—前一次的工作目录;PWD—当前的工作目录。

(2)当我们在shell中输入“man pwd”时可以看到pwd的帮助文档。但是输入“pwd --help”却是如下错误提示:

这主要是由于内部命令和外部命令的区别,pwd是内部命令,而/bin/pwd就是外部命令。显示当前目录时,/bin/pwd能更加准确地显示当前工作目录的完整文件路径,比如在多人共享同一台Linux机器时,经常会发现当前目录被别人删除后,pwd命令仍然会显示那个目录,而/bin/pwd则不会。

(3)进一步地,在root权限下将/bin目录下的ls命令的执行文件移动到别目录中去,例如:mv /bin/ls /root,会发现无论在哪里都无法顺利执行ls命令。原因在于新的目录“/root”并不在PATH指定的路径中,而外部命令必须通过PATH指定的路径来找到命令对应的执行文件。可以使用PATH="$PATH":/root将新的目录“/root”加入PATH环境变量。

(4)shell命令解释器在执行命令时,先尝试按照内部命令来执行,如果要执行的命令不是内部命令,则按照外部命令去查找对应的执行文件所在的目录,并执行。当要执行的命令不是内部命令时(例如ls),如果有两个ls指令分别在不同的目录中(例如/usr/local/bin/ls和/bin/ls),shell命令解释器就根据PATH里面哪个目录先被查询到,则那个目录下的命令就先被执行。

转自:http://blog.csdn.net/holybin/article/details/24230747

Linux内建命令和外部命令的更多相关文章

  1. shell的内建命令和外部命令

    shell的内建命令和外部命令 Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部:后者是一个独立的文件(可以是二进制文件,也可以是一个 ...

  2. <linux下内置命令和外部命令>

    Linux下内置命令和外部命令 1.linux的命令可以分为内部命令和外部命令: 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高. 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内 ...

  3. centos 特殊权限 各种搜索命令 lsattr ,chattr,suid,sgid,sbit,file,type是否是内置命令,stat文件属性 ,whereis,locate,find,ln 内部命令和外部命令 第五节课

    centos 特殊权限 各种搜索命令 lsattr ,chattr,suid,sgid,sbit,file,type是否是内置命令,stat文件属性 ,whereis,locate,find,ln   ...

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

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

  5. shell内置命令和外部命令的区别

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

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

    为了提高系统运行效率,将经常使用的轻量的命令在系统启动时一并加载这些命令到内存*shell随时调用,这部分命令即为内部命令.反之,只有当被调用时才会被硬盘加载的这部分命令即为外部命令. 内部命令实际 ...

  7. Bash 中同名的内部命令和外部命令

    昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受 ...

  8. mysql安装好之后,查询显示MySQL不是内部命令或外部命令问题

    使用cmd来调用MySQL的时候提示错误,错误是说MySQL不是内部或外部命令. 1.如图所示,遇到的mysql命令错误. 2.现在就要查询mysql是安装在哪,我们在计算机里面搜索mysql.exe ...

  9. C# 调用.bat 提示该命令不是内部命令或外部命令

    前提:双击.bat文件可以执行成功,用C#调用提示该命令不是内部命令或外部命令...... 解决方法:下面代码的红色标注,既要设置.bat文件的文件名FileName,也要设置.bat文件所在的文件夹 ...

随机推荐

  1. Asp.Net 上传图片并生成高清晰缩略图

    在asp.net中,上传图片功能或者是常用的,生成缩略图也是常用的.baidu或者google,c#的方法也是很多的,但是一用却发现缩略图不清晰啊,缩略图片太大之类的事情,下面是我在处理图片上的代码, ...

  2. JS微信分享不好写?来封装一下

    微信开发这块,作为开发工程师来说,一般是避免不了的,也好像发现一些朋友写微信分享都是在每个页面一大把一大把的代码. 代码冗余,即便是复制过来再改也很麻烦. 之前自己封装了一下js,今天来分享一下,希望 ...

  3. wget的下载与安装使用

    wget的下载与安装:下载地址:ftp://ftp.cs.cuhk.edu.hk/pub/gnu/gnu/wget安装:先把wget下载到的tar文件解压,然后cd到wget目录下# ./config ...

  4. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  5. Python文件的读写

    一.写数据 f = open("hello.txt", "w") f.write("hello world python!") f.clos ...

  6. java核心技术-(总结自杨晓峰-java核心技术36讲)

    1. 谈谈你对java平台的理解 首先是java最显著的两个特性,一次写入处处运行:还有垃圾收集器gc,gc能够对java内存进行管理回收,程序员不需要关心内存的分配和回收问题 然后谈谈jre和jdk ...

  7. Python 模拟鼠键

    让python 自动操作桌面或应用窗口,点击,滑动鼠标,输入文字等 # coding=utf-8 from pymouse import PyMouse from pykeyboard import ...

  8. Objective-C NSTableView重点知识汇总

    NSTableView不可滚动,通常将其嵌入NSScrollView以支持NSTableView. Cell Based View Based 1.遵循协议NSTableViewDataSource, ...

  9. 20155327 2017-2018-2《Java程序设计》课程总结

    20155327 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系,对课程的展望:https://www.cnblogs.com/l97- ...

  10. QT 操作数据库SQLite实例

    #include "widget.h" #include <QApplication> #include <QtSql> #include <QTex ...