在撰寫 Shell Script 或程式時,了解 Exit Code(退出碼)是很重要的基礎。當程式執行完畢後,會回傳一個整數給作業系統,告知執行結果是否成功,這個整數就是 Exit Code。
什麼是 Exit Code?
Exit Code 是程式結束時傳回給作業系統的整數值:
- 0:代表執行成功(Success)
- 非 0:代表執行失敗或有錯誤
Shell(如 bash、zsh)在執行完指令後,會將 Exit Code 存在特殊變數 $? 中。
1
2
3
4
5
|
ls /existing-dir
echo $? # 輸出 0(成功)
ls /nonexistent-dir
echo $? # 輸出 2(找不到目錄)
|
使用 zsh 時,若上一個指令執行失敗,提示符號前會顯示 ✘ 符號,提醒你指令出錯。
常見標準 Exit Code
| Exit Code |
意義 |
0 |
成功(Success) |
1 |
一般錯誤(General Error) |
2 |
Shell 誤用(Misuse of shell built-ins) |
126 |
指令無法執行(Command not executable,可能是權限問題) |
127 |
找不到指令(Command not found) |
128 |
無效的退出引數 |
128+N |
被信號 N 中斷(例如 SIGTERM = 143) |
130 |
被 Ctrl+C 中斷(SIGINT,= 128+2) |
137 |
被 SIGKILL 強制終止(= 128+9) |
Shell Script 中使用 Exit Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/bin/bash
# 執行指令並判斷結果
if ! cp source.txt destination.txt; then
echo "複製失敗!" >&2
exit 1
fi
# 使用 $? 判斷
pg_dump mydb > backup.sql
if [ $? -ne 0 ]; then
echo "備份失敗" >&2
exit 1
fi
echo "備份成功"
exit 0
|
在 CI/CD 中,Pipeline 會根據 Exit Code 判斷步驟是否成功:Exit Code 0 繼續下一步,非 0 則中斷 Pipeline。
各程式語言的實作
Shell Script
1
2
3
4
5
|
#!/bin/bash
# script 預設以最後一個指令的 exit code 作為回傳值
# 或明確指定:
exit 0 # 成功
exit 1 # 失敗
|
Java
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Main {
public static void main(String[] args) {
try {
// 執行業務邏輯
System.out.println("執行成功");
System.exit(0);
} catch (Exception e) {
System.err.println("執行失敗: " + e.getMessage());
System.exit(1);
}
}
}
|
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import sys
def main():
try:
# 執行業務邏輯
print("執行成功")
sys.exit(0)
except Exception as e:
print(f"執行失敗: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
|
Node.js
1
2
3
4
5
6
7
8
|
try {
// 執行業務邏輯
console.log('執行成功');
process.exit(0);
} catch (err) {
console.error('執行失敗:', err.message);
process.exit(1);
}
|
在 Crontab 中使用 Exit Code
1
2
|
# 執行成功才發通知,失敗時記錄錯誤
0 2 * * * /scripts/backup.sh && echo "備份成功" | mail -s "Backup OK" admin@example.com
|
參考資料