Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 指令分類完全指南:內建指令 vs 外部指令,識別方法與執行機制差異

編輯:關於 Linux

Linux Shell 指令分為「內建指令」與「外部指令」兩大類,它們的載入方式、執行效率、環境影響截然不同。本文詳細解析兩類指令的特徵、識別方法、PATH 搜尋機制與實戰差異。

指令分類示意

一、內建指令

定義

  • 內建於 Shell 程式碼中(如 Bash、Zsh、Dash)
  • 無需建立子進程,直接在當前 Shell 進程執行
  • 啟動極快、無 fork/exec 開銷
  • 可直接修改 Shell 內部狀態(環境變數、工作目錄、選項等)

常見內建指令

cd, pwd, echo, export, unset, alias, unalias,
read, printf, test, [, [[, 
break, continue, return, exit,
source, ., type, command, builtin,
jobs, fg, bg, kill, disown,
ulimit, umask, set, shopt,
history, fc, bind, complete,
declare, local, readonly,
exec, eval, trap, shift,
getopts, let, (( )), mapfile

識別方法

$ type cd
cd is a shell builtin

$ type -t cd
builtin

二、外部指令

定義

  • 獨立的可執行檔案(ELF 二進位或 Shebang 腳本)
  • 儲存在檔案系統路徑中(/bin、/usr/bin、/usr/local/bin 等)
  • 執行時 Shell fork() 子進程 → exec() 載入執行
  • 子進程環境獨立,不影響父 Shell 狀態

常見外部指令

ls, cp, mv, rm, cat, grep, sed, awk, find,
ps, top, kill, df, du, mount, umount,
tar, gzip, ssh, scp, rsync,
git, docker, python, node, java,
gcc, make, cmake,
systemctl, service, journalctl,
apt, yum, dnf, pacman

識別方法

$ type ls
ls is hashed (/usr/bin/ls)

$ type -t ls
file

$ which ls
/usr/bin/ls

$ ls -l /usr/bin/ls
-rwxr-xr-x 1 root root 133760 ... /usr/bin/ls

三、執行機制差異深度對比

四、PATH 搜尋機制(僅適用外部指令)

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 搜尋順序:從左到右,找到第一個可執行檔即停止
# 同名指令:優先使用較早目錄的版本

繞過別名/函數/內建指令,強制執行外部指令

# 1. 使用 command 內建指令
command ls

# 2. 使用完整路徑
/bin/ls

# 3. 使用反斜線跳過別名
\ls

五、特殊類別

特性內建指令外部指令
進程建立無fork() + exec()
啟動速度極快(微秒級)較慢(毫秒級)
記憶體開銷共享 Shell 記憶體獨立進程空間
環境影響可修改父 Shell 狀態隔離,不影響父 Shell
環境變數修改直接生效僅影響子進程
工作目錄變更cd 直接生效子進程變更不影響父 Shell
I/O 重導向Shell 直接處理子進程繼承檔案描述符
信號處理Shell 統一管理子進程獨立處理
可用性需 Shell 支援跨 Shell/語言通用

六、實戰判斷流程

# 完整判斷腳本
cmd_type=$(type -t "$1")
case $cmd_type in
  builtin)  echo "內建指令" ;;
  file)     echo "外部指令:$(which "$1")" ;;
  alias)    echo "別名:$(alias "$1")" ;;
  function) echo "函數" ;;
  keyword)  echo "關鍵字" ;;
  *)        echo "未知:$1" ;;
esac

七、效能優化啟示

  • 迴圈中大量呼叫:優先使用內建指令(如 [[ 而非 test,printf 而非外部 date)
  • 避免在迴圈中呼叫外部指令,改用管道/重導向批次處理
  • command -v 比 which 更可靠(which 可能為外部指令、不支援別名/函數)

理解內建與外部指令的本質差異,能幫助您撰寫高效能 Shell 腳本、正確診斷環境變數不生效、工作目錄不變更等經典問題。

Copyright © Windows教程網 All Rights Reserved
類別說明範例
關鍵字Shell 語法結構,非指令if, for, while, case, function
別名指令替代字串,展開後再解析alias ll='ls -l'
函數Shell 內定義的程式碼塊myfunc() { ... }
保留字語法保留,不可作變數名then, else, do, done