分類:-[小西南]-bash
(8434) (0)函數
Shell提供了一些用於調試腳本的選項:ui
使用這些選項有三種方法。好比現有以下已獲取運行權限腳本文件function.sh:spa
#!/bin/sh.net foo(){ echo "Shell bash function is called"; }命令行 echo"---start--"調試 fooblog echo"---end--" |
分別用Shell腳本調試方法來調試。進程
將以上腳本第二行的「;」去掉。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 「}」) |
#! /bin/sh -x |
只能在腳本開頭加入其中一個調試選項。
#! /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 |
避免幾種調試選項混用的狀況。
用戶輸入一條命,Shell就解釋執行一條,這種方式稱爲交互式。用戶在命令行輸入命令後,通常狀況下Shell會fork並exec該命令(進程控制 [fork() exec() wait() waitpid()])。可是Shell的內建命令例外,執行內建命令至關於調用Shell進程中的一個函數,並不建立新的進程。Shell的內建命令用man bash-builtins命令查看。
Shell會fork一個子進程並調用exec執行腳本文件,exec系統用它的另一種機制來執行文本文件:若是要執行的是一個文本文件,而且第一行用Shebang(#! /bin/sh)指定了解釋器,則用解釋器程序的代碼段替換當前進程,而且從解釋器的_start開始執行,而這個腳本文本文件被看成命令行參數傳給解釋器。所以,執行腳本文件至關於執行程序:/bin/sh 腳本文件。
因此,能夠在Shell下直接用「/bin/sh 腳本文件」(指腳本文件內容的第一句即腳本解釋器)的方式執行腳本文件,這種方式執行腳本文件還不須要腳本文件的運行權限。
如現有如下腳本:
#!/bin/sh cd.. ls |
其中cd是Shell的內建命令,ls不是Shell的內建命令(能夠用which ls查看)。
則Shell執行此腳本的過程以下:
[2014.8.11 - 17.17]
LCNote Over.