Linux内建命令和外部命令
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内建命令和外部命令的更多相关文章
- shell的内建命令和外部命令
shell的内建命令和外部命令 Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部:后者是一个独立的文件(可以是二进制文件,也可以是一个 ...
- <linux下内置命令和外部命令>
Linux下内置命令和外部命令 1.linux的命令可以分为内部命令和外部命令: 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高. 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内 ...
- 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 ...
- Linux shell 内部命令与外部命令有什么区别以及怎么辨别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- shell内置命令和外部命令的区别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- Linux的内部命令和外部命令
为了提高系统运行效率,将经常使用的轻量的命令在系统启动时一并加载这些命令到内存中供shell随时调用,这部分命令即为内部命令.反之,只有当被调用时才会被硬盘加载的这部分命令即为外部命令. 内部命令实际 ...
- Bash 中同名的内部命令和外部命令
昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受 ...
- mysql安装好之后,查询显示MySQL不是内部命令或外部命令问题
使用cmd来调用MySQL的时候提示错误,错误是说MySQL不是内部或外部命令. 1.如图所示,遇到的mysql命令错误. 2.现在就要查询mysql是安装在哪,我们在计算机里面搜索mysql.exe ...
- C# 调用.bat 提示该命令不是内部命令或外部命令
前提:双击.bat文件可以执行成功,用C#调用提示该命令不是内部命令或外部命令...... 解决方法:下面代码的红色标注,既要设置.bat文件的文件名FileName,也要设置.bat文件所在的文件夹 ...
随机推荐
- 随堂小测app(nabcd)
N 现在,老师想要组织测验,需要提前印制试卷,费时费力,考勤采取传统的点名的方式,过程繁琐且结果水分大. 而随堂小测app通过在线答题,智能定位可以帮助老师掌握学生对知识的掌握程度,了解学生的到客情况 ...
- VirtualBox AndroidX86 网络设置
在Virtualbox中,把虚拟机网络设为“网络地址转换(NAT)”模式,高级中控制芯片(T)选择:PCnet-FAST III(Am79C973), 然后启动你的android-x86 4.0虚拟机 ...
- js自动类型转换
<script> testeq0 = null == undefined; testeq1 = "0" == 0; //比较前字符串转换为数字 testeq2 = 0 ...
- Linux下修改时间
修改linux的时间可以使用date指令 date命令的功能是显示和设置系统日期和时间. 输入date 查看目前系统时间. 修改时间需要 date -功能字符 修改内容 命令中各选项的含义分别为: - ...
- $思维导图——numpy基本知识
- JqGrid 隐藏水平滚动条完美解决方案
我有强迫症,网上找的几个看着就不舒服 不用更改样式表,隐藏最右侧的边框. .ui-jqgrid .ui-jqgrid-bdiv{ overflow-x: hidden; } 不用通过js控制加1px ...
- 利用Masscan批量生成随机ip地址表
简介 Masscan是Kali下集成的高效扫描器,和nmap命令有很多相似之处 命令生成随机ip masscan -sL 10.0.0.0/24 > c段.txt masscan -sL 10. ...
- Python面试题之列表推导式
题目要求: 生成如下列表 [[0,0,0,0,0,],[0,1,2,3,4,],[0,2,4,6,8,],[0,3,6,9,12,]] (考察列表生成式和基本逻辑推理) 方法1: list1 = [] ...
- TCP深入详解
TCP三次握手.四次挥手时序图: #TCP协议状态机 1.TCP建立连接时的初始化序列号X.Y可以是写死固定的吗? 如果初始化序列号(缩写为ISN:Inital Sequence Numbe ...
- IT最新最火的网络词汇*2*(文章来源电商)
P2P.P2C .O2O .B2C.B2B.C2C等等最新最火的网络用词直接将我们都弄晕了,特此今天将这些划时代意义的词汇总结起来,若有什么不足之处,希望各位评论指正. 大致意思为: 1. ...