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

2022-06-25 19:54:14 字數 3017 閱讀 4599

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

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

#!/bin/sh

processid()

') echo $ipid

}case "$1" in

i)processid $2

;;*)

echo "parameter error..$1"

;;esac

我們執行這個指令碼查詢 zone9_log1 的程序id,下面是執行的結果

[wanng@localhost ~]$ ./a.sh i zone9_log1

130530 144391 144392

為了和 zone9_log1 程序實際的程序id對比,我們單獨執行 ps -ef | grep -w zone9_log1 | grep -v grep | awk '' 命令,執行結果如下:

[wanng@localhost ~]$ ps -ef | grep -w zone9_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 zone9_log1

130530 144885 144886

[wang@localhost ~]$ cat out1

wang 130530 1 0 4月24 pts/10 00:07:47 ./zone9_log1 ./zone9_log1.lua

wang 144885 109338 0 20:45 pts/8 00:00:00 /bin/sh ./a.sh i zone9_log1

wang 144886 144885 0 20:45 pts/8 00:00:00 /bin/sh ./a.sh i zone9_log1

wang 144888 144886 0 20:45 pts/8 00:00:00 grep -w zone9_log1

[wang@localhost ~]$ cat out2

wang 130530 1 0 4月24 pts/10 00:07:47 ./zone9_log1 ./zone9_log1.lua

wang 144885 109338 0 20:45 pts/8 00:00:00 /bin/sh ./a.sh i zone9_log1

wang 144886 144885 0 20:45 pts/8 00:00:00 /bin/sh ./a.sh i zone9_log1

[wang@localhost ~]$ cat out3

130530

144885

144886

[wang@localhost ~]$

執行指令碼的時候,缺省會建立乙個新的shell(也即乙個新的程序),上面的指令碼 a.sh 就是在新的shell環境中執行的。從上面的測試結果可以看出,ps -ef | grep -w zone9_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 zone9_log1

130530

[wanng@localhost ~]$ cat out1

wanng 130530 1 0 4月24 pts/10 00:07:51 ./zone9_log1 ./zone9_log1.lua

wanng 146170 146168 0 21:11 pts/8 00:00:00 grep -w zone9_log1

[wanng@localhost ~]$ cat out2

wanng 130530 1 0 4月24 pts/10 00:07:51 ./zone9_log1 ./zone9_log1.lua

[wanng@localhost ~]$ cat out3

130530

從上面的測試結果中看出,最後輸出的結果是正確的

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

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

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

shell命令之tee命令

tee命令 在輸出資訊的同時把資訊記錄到檔案中 例子 ls tee ls.txt將會在終端上顯示ls命令的執行結果,並把執行結果輸出到ls.txt檔案中,將會覆蓋原檔案的內容,若無ls.txt檔案,將會自動建立該檔案 ls tee a ls.txt保留ls.txt檔案中原來的內容,並把ls命令的執行...

shell除錯命令

set u 遇到不存在的變數就會報錯,並停止執行 set x 在執行結果之前,先輸出執行的那一行命令 set e set e 指令碼只要發生錯誤,就終止執行 set e表示關閉 e選項 command true,使得該命令即使執行失敗,指令碼也不會終止執行 bash 會把最後乙個子命令的返回值,作為...