Shell腳本調試方法 Shell腳本執行的過程

Shell腳本調試方法 Shell腳本執行的過程

分類:-[小西南]-bash

 (8434)  (0)函數

1Shell腳本調試方法

Shell提供了一些用於調試腳本的選項:ui

 

  • -n,讀一遍腳本中的命令但不執行,用於檢查腳本中的語法錯誤
  • -v,一邊執行腳本,一邊將執行過的腳本命令打印到標準錯誤輸出。
  • -x,提供跟蹤執行信息,將執行的每一條命令和結果依次打印出來

 

使用這些選項有三種方法。好比現有以下已獲取運行權限腳本文件function.sh:spa

 

#!/bin/sh.net

foo(){ echo "Shell bash function is called"; }命令行

echo"---start--"調試

fooblog

echo"---end--"

分別用Shell腳本調試方法來調試。進程

 

(1) 命令行提供參數

將以上腳本第二行的「;」去掉。ci

sh  -n function.sh

function.sh: 7: function.sh: Syntax error:end of file unexpected (expecting 「}」)

sh  -v function.sh

#! bin/sh

 

foo() { echo"Shell bash function is called" }

echo"---start--"

foo

echo"---end--"

function.sh: 7: function.sh: Syntax error:end of file unexpected (expecting 「}」)

sh  -x  function.sh

function.sh:7: function.sh: Syntax error: end of file unexpected (expecting 「}」)

 

 

(2) 腳本開頭提供參數

#! /bin/sh  -x

 

只能在腳本開頭加入其中一個調試選項。

 

 

(3) 腳本中用set命令啓用或禁用調試選項

#! /bin/sh

foo() { echo "Shell bash function iscalled"; }

echo "---start--"

set -v

foo

set +v

echo"---end--"

set -v和set+v分別表示啓用和禁用-x參數,這樣能夠只對腳本中的某一段進行跟蹤調試。./function.sh結果:

 

 

---start—

foo

Shell bash functionis called

set +v

---end

 

避免幾種調試選項混用的狀況

 

2 Shell執行腳本過程

(1) 執行交互式命令

用戶輸入一條命,Shell就解釋執行一條,這種方式稱爲交互式。用戶在命令行輸入命令後,通常狀況下Shell會fork並exec該命令(進程控制 [fork() exec() wait() waitpid()])。可是Shell的內建命令例外,執行內建命令至關於調用Shell進程中的一個函數,並不建立新的進程。Shell的內建命令用man bash-builtins命令查看。

 

 

(2) 執行腳本文件

 

Shell會fork一個子進程並調用exec執行腳本文件,exec系統用它的另一種機制來執行文本文件:若是要執行的是一個文本文件,而且第一行用Shebang(#! /bin/sh)指定了解釋器,則用解釋器程序的代碼段替換當前進程,而且從解釋器的_start開始執行,而這個腳本文本文件看成命令行參數傳給解釋器。所以,執行腳本文件至關於執行程序:/bin/sh 腳本文件

 

因此,能夠在Shell下直接用「/bin/sh 腳本文件」(指腳本文件內容的第一句即腳本解釋器)的方式執行腳本文件,這種方式執行腳本文件還不須要腳本文件的運行權限。

 

 

如現有如下腳本:

#!/bin/sh

cd..

ls

其中cd是Shell的內建命令,ls不是Shell的內建命令(能夠用which ls查看)。

 

則Shell執行此腳本的過程以下:

 

  • 交互Shell(bash)fork/exec一個子Shell(sh)用於執行腳本,父進程bash等待子進程sh終止。
  • sh讀取腳本中的cd..命令,調用相應的函數執行內建命令,改變當前工做目錄爲上一級目錄。
  • sh讀取腳本中的ls命令,fork/exec這個程序,列出當前工做目錄下的文件,sh等待ls終止。
  • ls終止後,sh繼續執行,讀到腳本文件末尾,sh終止。
  • sh終止後,bash繼續執行,打印提示符等待用戶輸入。

 

[2014.8.11 - 17.17]

 

LCNote Over.

相關文章
相關標籤/搜索