内部命令与外部命令

今天用串口线操作开发板时,由于串口线的问题,输入的命令老有错误显示。再次开机时输入命令时有时提示命令找不到。cd命令可以,ls、vi等命令一律提示命令找不到。

想不通是哪里错了,重新烧录内核还是有一样的问题。我便认为是文件系统什么地方出问题了,想要重新烧录文件系统。可是原来文件系统里的东西便都没了,谨慎起见先给师兄打电话问了一下。结果师兄一席话点醒梦中人。

原来linux中的命令分为内部命令和外部命令:

所謂的內部命令是寫在bash原始碼裡面的(這邊假設談的是bash),你要修改這些內部命令除非透過修改bash的原始碼。

而外部命令才是bash之外自己額外安裝的,比方通常在/bin, /usr/bin, /sbin, /usr/sbin.....等。

例如:type是個內建命令。

  1. # type type
  2. type is a shell builtin
  3. # echo $PATH
  4. /sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
  5. # which type
  6. which: no type in (/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin)


上面很容易發現,type是個內建命令。

像ls、vi属于外部命令,必须将其所在目录包含进PATH环境变量才能正常使用,而cd、echo属于内部命令,一直都可使用。

我用echo $PATH命令查看了一下PATH环境变量,果然PATH的内容被破坏了。重新将/bin, /usr/bin, /sbin, /usr/sbin等目录加入后恢复正常。

 

补充:

命令可能是一个关键词(if, while, function, untill等),一个别名(如:alias ll='ls -l'),一个函数(如:function hello { echo "Hello"; }),一个内置命令(cd, type等),应用程序(可执行程序或shell脚本)。

shell会按照命令的类型按先后顺序来执行它们。下面会用实验来检验一下。

以下摘自《Learning the bash shell, 3rd Edition》
1, Aliases

2, Keywords such as function and several others, like if and for

3, Functions

4, Built-ins like cd and type

5, Scripts and executable programs, for which the shell searches in the directories listed in the PATH environment variable

<think>嗯,用户想了解Linux系统区分内部命令外部命令的方法。根据提供的引用资料,这个问题可以从理论和实践两个层面来解答。 用户可能是个刚接触Linux的系统管理员或开发者,环境复杂或系统异常时需要确认命令来源的可靠性。这个问题看似基础,但在安全运维场景下很重要——比如系统被入侵后,内部命令可能被篡改,此时必须用绝对路径调用外部命令。 引用[1]提到type命令是区分的核心工具,引用[2]补充说明了执行效率差异(内部命令效率高),引用[3]则解释了外部命令的存储位置。需要把这些分散信息整合成操作指南。 具体实现上: 首先用type命令最直接,内部命令显示"builtin",外部命令显示路径。结合-a参数还能看同名命令的优先级,比如系统有/bin/cd和内置cd时能识别调用顺序。hash命令虽然也能查缓存,但不如type全面。 特殊情况的处理也要提醒:如外部命令被删除后type会报错;busybox这种混合环境需要额外注意。安全建议部分尤其重要——异常环境下必须用绝对路径,这点要突出强调。 用户可能会延伸思考:为什么会有内外之分?所以补充了设计逻辑差异:内部命令为高频操作优化(如cd),外部命令保持可扩展性。最后用表格对比特性,这样视觉更清晰。 相关问题设计成阶梯式比较好:从识别方法(基础)到原理(进阶)再到应用场景(高阶)。这样用户无论是什么级别都能找到继续探索的入口。 </think>在Linux系统中,区分内部命令(内置命令)和外部命令的方法如下: --- ### **核心区分方法** #### 1. **使用 `type` 命令** ```bash type -t 命令名称 ``` - **输出 `builtin`** → 内部命令(如 `cd`, `echo`) ```bash $ type -t cd builtin ``` - **输出 `file`** → 外部命令(如 `ls`, `grep`) ```bash $ type -t ls file ``` - **同时存在时**(如 `echo` 既有内置也有外部): ```bash $ type -a echo echo is a shell builtin # 内部命令 echo is /usr/bin/echo # 外部命令 ``` #### 2. **使用 `command -V` 命令** ```bash command -V 命令名称 ``` - **标注 `builtin`** → 内部命令 ```bash $ command -V pwd pwd is a shell builtin ``` - **显示路径** → 外部命令 ```bash $ command -V top top is /usr/bin/top ``` #### 3. **检查命令存储位置** - **内部命令**:集成在Shell解释器中(如 `bash`、`zsh`),无独立文件。 - **外部命令**:存储在特定目录(如 `/bin`、`/usr/bin`),可通过 `which` 或 `whereis` 定位: ```bash $ which ls /usr/bin/ls $ whereis grep grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz ``` --- ### **关键特性对比** | **特性** | 内部命令 (`builtin`) | 外部命令 (`file`) | |------------------|-------------------------------------------|-------------------------------------------| | **来源** | Shell解释器自带(如 `bash` 内置) | 独立可执行文件(如 `/bin/ls`) | | **执行效率** | 高(无磁盘I/O,直接Shell进程执行) | 较低(需磁盘I/O,创建新进程)[^2] | | **存储位置** | 无独立文件 | `/bin`, `/usr/bin`, `/sbin` 等[^3] | | **依赖环境** | 不受 `PATH` 影响 | 依赖 `PATH` 环境变量查找 | | **查看帮助** | `help 命令`(如 `help cd`) | `man 命令` 或 `命令 --help` | --- ### **操作场景建议** 1. **异常环境排查**(如怀疑系统被入侵): - 优先使用外部命令的**绝对路径**(如 `/usr/bin/ls`),避免恶意篡改的内部命令[^1]。 2. **脚本兼容性**: - 若需跨Shell环境运行,避免依赖特定Shell内部命令(如 `bash` 的 `source` 在 `sh` 中不兼容)。 --- ### **示例验证** ```bash # 内部命令验证 $ type -t umask builtin $ command -V umask umask is a shell builtin # 外部命令验证 $ type -t nano file $ which nano /usr/bin/nano ``` > **安全提示**:当系统状态异常时,使用 `/usr/bin/env` 调用外部命令可避免环境变量劫持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值