Contents

Exit Codes 程式回傳錯誤碼

在撰寫 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

參考資料