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,/usr/bin,/sbin,/usr/sbin......等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。

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

type: type [-afptP] name [name ...]

Display information about command type.

For each NAME, indicate how it would be interpreted if used as a

command name.

Options:

-a display all locations containing an executable named NAME;

includes aliases, builtins, and functions, if and only if

the `-p' option is not also used

-f suppress shell function lookup

-P force a PATH search for each NAME, even if it is an alias,

builtin, or function, and returns the name of the disk file

that would be executed

-p returns either the name of the disk file that would be executed,

or nothing if `type -t NAME' would not return `file'.

-t output a single word which is one of `alias', `keyword',

`function', `builtin', `file' or `', if NAME is an alias, shell

reserved word, shell function, shell builtin, disk file, or not

found, respectively

Arguments:

NAME Command name to be interpreted.

Exit Status:

Returns success if all of the NAMEs are found; fails if any are not found.

常用的三个参数:-t对应-type,-a对应-all,-p对应-path,使用:

type [-a | -t | -p] name 或

type [-all | -type | -path] name。

(1)没有参数的状况下,它会显示出shell如何解译name做为命令。

(2)如果有"-type",它将会显示alias、 keyword、function、builtin或file。

file:表示为外部指令;alias:表示该指令为命令别名所设定的名称;builtin:表示该指令为 bash 内建的指令功能。

(3)如果有"-path"的参数,它将会显示该命令的完整档名(外部指令)或显示为内建指令,找不到的话,不显示任何东西。

(4)如果有"-all"的参数,会将由PATH变量定义的路径中所有含有name指令的路径都列出来,即显示所有可执行name的可能路径。

例如1:

holybin@localhost:~$ type cd

cd is a shell builtin #这里可以看出cd是一个内部命令

例如2:

holybin@localhost:~$ type ls

ls is aliased to `ls --color=auto' # 没有加上任何参数,仅列出 ls 这个指令的最主要使用情况

holybin@localhost:~$ type -t ls

alias # -t 参数则仅列出 ls 这个指令的最主要使用情况说明

例如3:

holybin@localhost:~$ type -a ls

ls is aliased to `ls --color=auto'

ls is /bin/ls # 列出所有信息:这里可以看出ls是一个外部命令。

【命令与系统调用】

通常情况下,脚本中的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”却是如下错误提示:

holybin@localhost:~$ pwd --help

-bash: pwd: --: invalid option

pwd: usage: pwd [-LP]

但是输入“ /bin/pwd --help”就能正常显示pwd的帮助文档:

holybin@localhost:~$ /bin/pwd --help

Usage: /bin/pwd [OPTION]...

Print the full filename of the current working directory.

-L, --logical use PWD from environment, even if it contains symlinks

-P, --physical avoid all symlinks

--help display this help and exit

--version output version information and exit

NOTE: your shell may have its own version of pwd, which usually supersedes

the version described here. Please refer to your shell's documentation

for details about the options it supports.

Report pwd bugs to bug-coreutils@gnu.org

GNU coreutils home page:

General help using GNU software:

For complete documentation, run: info coreutils 'pwd invocation'

这主要是由于内部命令和外部命令的区别,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里面哪个目录先被查询到,则那个目录下的命令就先被执行。

参考:区分Linux内建命令和外部命令,linux的内建命令和外部命令

linux getdents 例子,Linux内建命令和外部命令(整理)相关推荐

  1. linux getdents 例子,Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容

    上回我们说到,如何创建文件夹和文件.我们发现,在sysfs中,inode并不那么重要.这是因为我们所要读写的信息已经就在内存中,并且已经形成了层次结构.我们只需有dentry,就可以dentry-&g ...

  2. 14.Linux rpm,brew软件安装包命令,zsh和bash,内置命令和外部命令,ps命令,top命令解析,swp,为什么cpu利用率很低,负载却很高?

    解释一下rpm, opt,opt-get, brew,brewhome rpm,apt,apt-get,brew,和homebrew都是与软件包管理有关的术语.它们分别用于不同的操作系统. rpm是一 ...

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

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

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

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

  5. 查看命令为内置命令还是外部命令

    查看命令为内置命令还是外部命令---type        有木有 ? 有的用户在用一般用户身份执行ifconfig eth0  会出现"-bash: ifconfig :command n ...

  6. shell内部命令和外部命令

    什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序,如果把L ...

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

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

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

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

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

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

最新文章

  1. React 入门笔记 1
  2. python官网 中文版 新闻-新闻主页 - python兵者 - 博客园
  3. GIS基础知识汇总篇(五)-无人机真正射影像的概念和制作原理
  4. Qt工作笔记-依赖于QAbstractTableModel实现自定义TableModel
  5. python矩阵后加点_Python Numpy和矩阵的相关面试问题
  6. (二)stm32之中断配置
  7. MongoDB(五)-- 副本集(replica Set)
  8. c mysql maxpoolsize_mysql数据库参数innodb_buffer_pool_size和max_connections
  9. 计算机二级34套word答案,全国计算机二级C选择题题库第34套
  10. C++统计博客园写过的代码行数
  11. 两个表里数组字段的映射关联(stuff ,charindex,for xml path)
  12. matlab之find函数
  13. amd显卡测试帧数显示软件,NVIDIA发布帧数显示及显卡基准测试应用FrameView
  14. 爬虫python代码网易云_用python爬取网易云音乐歌曲的歌词
  15. 离散数学(第二版) 第一章、第二章习题
  16. 获取周日历/月日历input框选择的日期范围
  17. python四分位数_下四分位数和上四分位数分别是什么?能举个栗子吗?主要想了解python的quantile函数具体含义?...
  18. 【参赛作品68】PostgrSQL和OpenGauss/MogDB分区表对比(二)
  19. java.util.concurrent.ExecutionException 错误解决。
  20. Spring MVC学习

热门文章

  1. 【离散数学中的数据结构与算法】三 同余定理
  2. Ipython\Jupyter数据分析工具
  3. css关于position的几个值
  4. LeetCode 32. Longest Valid Parentheses
  5. android学习的一点点网站资料
  6. 生成六位验证码python代码
  7. 4W1T教程1 如何使用幻灯片
  8. DipperRiver.Net通信协议设计
  9. 图谱问答-句子向量模型部署项目总结(未完)
  10. [Leetcode][JAVA][第20题][Stack][Map]