指令碼命令 利用 tee 命令除錯shell指令碼

2021-10-16 09:37:22 字數 2980 閱讀 3815

在編寫shell指令碼時,除錯是個比較麻煩的事,特別是涉及到多層管道命令的時候,會產生多個中間結果,tee命令的作用是從標準輸入中讀取資料寫入標準輸出或檔案中,利用它可以從管道中讀取中間結果並寫入本地臨時檔案中,通過中間結果可以一步一步的定位到指令碼的錯誤

例項

下面是乙個簡單的指令碼,指令碼中 processid 函式的作用是查詢指定程序名字的程序id,在管理linux伺服器的過程中,這個是很常見的功能,processid 函式作用是利用多層管道命令查詢程序id,以下是測試指令碼原始碼

#!/bin/shprocessid()')    echo $ipid}case "$1" in    i)       processid $2      ;;    *)            echo "parameter error..$1"      ;;esac
執行指令碼我們執行這個指令碼查詢 game9_log1 的程序id,下面是執行的結果

[wanng@localhost ~]$ ./a.sh i game9_log1130530 144391 144392
為了和 game_log1 程序實際的程序id對比,我們單獨執行 ps -ef | grep -w game9_log1 | grep -v grep | awk '' 命令,執行結果如下:

[wanng@localhost ~]$ ps -ef | grep -w game9_log1 | grep -v grep | awk ''130530
問題同樣的命令,確得到了不同的結果,我們在指令碼中加入 tee 命令輸出管道的中間結果,調整之後的的指令碼如下:

processid()') | tee out3    echo $ipid}case "$1" in    i)       processid $2      ;;    *)        echo "parameter error..$1"      ;;esac
再次執行指令碼,在當前目錄會生成 out1 out2 out3 三個檔案,記錄這管道命令的中間結果,下面是指令碼執行結果以及 out1 out2 out3 檔案的內容

[wang@localhost ~]$ ./a.sh i game9_log1130530 144885 144886[wang@localhost ~]$ cat out1wang      130530      1  0 4月24 pts/10  00:07:47 ./game9_log1 ./game9_log1.luawang       144885 109338  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i game9_log1wang       144886 144885  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i game9_log1wang       144888 144886  0 20:45 pts/8    00:00:00 grep -w game9_log1[wang@localhost ~]$ cat out2wang      130530      1  0 4月24 pts/10  00:07:47 ./game9_log1 ./game9_log1.luawang       144885 109338  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i game9_log1wang       144886 144885  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i game9_log1[wang@localhost ~]$ cat out3130530144885144886[wang@localhost ~]$
原因執行指令碼的時候,缺省會建立乙個新的shell(也即乙個新的程序),上面的指令碼 a.sh 就是在新的shell環境中執行的。從上面的測試結果可以看出,ps -ef | grep -w game9_log1 命令的結果中包含了執行腳本身啟動的程序和我們要查詢的目標程序,我們只需要過濾掉指令碼本身的程序,就可以得到準確的程序id,調整之後的指令碼如下(暫時先保留 tee命令輸出的中間結果):

processid()') | tee out3    echo $ipid}case "$1" in    i)       processid $2      ;;    *)        echo "parameter error..$1"      ;;esac
上面processid函式中 grep -v $0 作用是過濾掉指令碼的名字,其中 $0 表示指令碼的名字 ( a.sh )

驗證

再次執行指令碼,結果如下:

[wanng@localhost ~]$ ./a.sh i game9_log1130530[wanng@localhost ~]$ cat out1wanng      130530      1  0 4月24 pts/10  00:07:51 ./game9_log1 ./game9_log1.luawanng       146170 146168  0 21:11 pts/8    00:00:00 grep -w game9_log1[wanng@localhost ~]$ cat out2wanng      130530      1  0 4月24 pts/10  00:07:51 ./game9_log1 ./game9_log1.lua[wanng@localhost ~]$ cat out3130530
從上面的測試結果中看出,最後輸出的結果是正確的

總結

多層管道在shell指令碼中是很常見的用法,使用起來也非常方便和高效的,但是指令碼一旦出問題除錯就會變得困難起來,合理的使用 tee 命令輸出管道的中間結果,可以快速的定位問題所在

利用 tee 命令除錯shell指令碼中的管道

在編寫shell指令碼時,除錯是個比較麻煩的事,特別是涉及到多層管道命令的時候,會產生多個中間結果,tee命令的作用是從標準輸入中讀取資料寫入標準輸出或檔案中,利用它可以從管道中讀取中間結果並寫入本地臨時檔案中,通過中間結果可以一步一步的定位到指令碼的錯誤 下面是乙個簡單的指令碼,指令碼中 proc...

shell指令碼 命令

命令連線符 表示不管前面是否執行成功都要執行 表示前面執行成功才執行後面 表示前面執行失敗才執行後面 read命令 read 選項 值 read p 提示語句 n 字元個數 t 時間秒 s 不顯示 運算子 expr 3 2 結果賦值 sum expr 3 2 或者 sum 3 2 乘法expr 3 ...

shell指令碼命令

1.建立檔案 home test test.log rootdir home test testfile rootdir test.log touch testfile 2.如果檔案存在則刪除檔案 if f testfile then rm rf testfile fi3.如果檔案不存在則建立檔案 ...