1. 程式人生 > >如何在 Linux 中啟用 Shell 指令碼的除錯模式【轉】

如何在 Linux 中啟用 Shell 指令碼的除錯模式【轉】

指令碼是儲存在一個檔案的一系列命令。在終端上輸入一個個命令,按順序執行的方法太弱了,使用指令碼,系統中的使用者可以在一個檔案中儲存所有命令,反覆呼叫該檔案多次重新執行命令。

在學習指令碼或寫指令碼的初期階段,我們通常從寫小指令碼或者幾行命令的短指令碼開始,除錯這樣的指令碼時我們通常無非就是通過觀察它們的輸出來確保其正常工作。

然而,當我們開始寫非常長或上千行命令的高階指令碼,例如改變系統設定的指令碼,在網路上執行關鍵備份 等等,我們會意識到僅僅看指令碼輸出是不足以在指令碼中找到 Bug 的!

因此,在 Linux 系列中這篇介紹 Shell 指令碼除錯, 我們將看看如何啟用 Shell 指令碼除錯,然後在之後的系列中解釋不同的 Shell 指令碼除錯模式以及如何使用它們。

如何開始寫一個指令碼

一個指令碼與其它檔案的區別是它的首行,它包含 #! (She-Bang - 釋伴:定義檔案型別)和路徑名(直譯器路徑),通知系統該檔案是一個命令集合,將被指定程式(直譯器)解釋。

下面是不同型別指令碼 首行 示例:

  1. #!/bin/sh [sh 指令碼]
  2. #!/bin/bash [bash 指令碼]
  3. #!/usr/bin/perl [perl 程式]
  4. #!/bin/awk -f [awk 指令碼]

注意:如果指令碼僅包含一組標準系統命令,沒有任何內部 Shell 指令,首行或 #! 可以去掉。

如何在 Linux 作業系統執行 Shell 指令碼

呼叫一個指令碼指令碼的常規語法是:

  1. $ 指令碼名 引數1 ... 引數N

另一種可能的形式是明確指定將執行這個指令碼的 Shell,如下:

  1. $ shell 指令碼名 引數1 ... 引數N

示例:

  1. $ /bin/bash 引數1 ... 引數N [bash 指令碼]
  2. $ /bin/ksh 引數1 ... 引數N [ksh 指令碼]
  3. $ /bin/sh 引數1 ... 引數N [sh 指令碼]

對於沒有 #! 作為首行,僅包含基礎系統命令的指令碼,示例如下:

  1. ### 指令碼僅包含標準系統命令
  2. cd /home/$USER
  3. mkdir tmp
  4. echo "tmp directory created under /home/$USER"

使它可執行並執行,如下:

  1. $ chmod +x 指令碼名
  2. $ ./指令碼名

啟用 Shell 指令碼除錯模式的方法

下面是主要的 Shell 指令碼除錯選項:

  • -v (verbose 的簡稱) - 告訴 Shell 讀取指令碼時顯示所有行,啟用詳細模式。
  • -n (noexec 或 no ecxecution 簡稱) - 指示 Shell 讀取所有命令然而不執行它們,這個選項啟用語法檢查模式。
  • -x (xtrace 或 execution trace 簡稱) - 告訴 Shell 在終端顯示所有執行的命令和它們的引數。 這個選項是啟用 Shell 跟蹤模式。

1、 改變 Shell 指令碼首行

第一個機制是改變 Shell 指令碼首行,如下,這會啟動指令碼除錯。

  1. #!/bin/sh 選項

其中, 選項可以是上面提到的一個或多個除錯選項。

2、 呼叫 Shell 除錯選項

第二個是使用如下除錯選項啟動 Shell,這個方法也會開啟整個指令碼除錯。

  1. $ shell 選項 引數1 ... 引數N

示例:

  1. $ /bin/bash 選項 引數1 ... 引數N

3、 使用 Shell 內建命令 set

第三個方法是使用內建命令 set 去除錯一個給定的 Shell 指令碼部分,如一個函式。這個機制是重要的,因為它讓我們可以去除錯任何一段 Shell 指令碼。

我們可以如下使用 set 命令開啟除錯模式,其中選項是之前提到的所有除錯選項。

  1. $ set 選項

啟用除錯模式:

  1. $ set -選項

禁用除錯模式:

  1. $ set +選項

此外,如果我們在 Shell 指令碼不同部分啟用了幾個除錯模式,我們可以一次禁用所有除錯模式,如下:

  1. $ set -

關於啟用 Shell 指令碼除錯模式,先講這些。正如我們看到的,我們可以除錯一整個 Shell 指令碼或者特定部分指令碼。

在此係列下面的兩篇文章中,我們會舉例介紹如何使用 Shell 指令碼除錯選項,進一步瞭解 詳細verbose、語法檢查syntax checking、 跟蹤tracing除錯模式。

更重要的是,關於這個指南,歡迎通過下面評論提出任何問題或反饋。

本文由 LCTT 組織編譯,Linux中國 榮譽推出