最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用 tee 命令調(diào)試shell腳本中的管道

 更新時(shí)間:2021年05月19日 08:44:37   作者:Linux開發(fā)那些事兒  
在編寫shell腳本時(shí),調(diào)試是個(gè)比較麻煩的事,特別是涉及到多層管道命令的時(shí)候,會產(chǎn)生多個(gè)中間結(jié)果,tee命令的作用是從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)寫入標(biāo)準(zhǔn)輸出或文件中,利用它可以從管道中讀取中間結(jié)果并寫入本地臨時(shí)文件中,通過中間結(jié)果可以一步一步的定位到腳本的錯(cuò)誤

實(shí)例

下面是一個(gè)簡單的腳本,腳本中 processid 函數(shù)的作用是查詢指定進(jìn)程名字的進(jìn)程ID,在管理linux服務(wù)器的過程中,這個(gè)是很常見的功能,processid 函數(shù)作用是利用多層管道命令查詢進(jìn)程ID,以下是測試腳本源碼

#!/bin/sh

processid()
{
    ipid=$(ps -ef | grep -w $1 | grep -v grep | awk '{print $2}')
    echo $ipid
}

case "$1" in
    i)
       processid $2
      ;;
    *)
        echo "parameter error..$1"
      ;;
esac

執(zhí)行腳本

我們執(zhí)行這個(gè)腳本查詢 zone9_log1 的進(jìn)程ID,下面是執(zhí)行的結(jié)果

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

為了和 zone9_log1 進(jìn)程實(shí)際的進(jìn)程ID對比,我們單獨(dú)執(zhí)行 ps -ef | grep -w zone9_log1 | grep -v grep | awk '{print $2}' 命令,執(zhí)行結(jié)果如下:

[wanng@localhost ~]$ ps -ef | grep -w zone9_log1 | grep -v grep | awk '{print $2}'
130530

問題

同樣的命令,確得到了不同的結(jié)果,我們在腳本中加入 tee 命令輸出管道的中間結(jié)果,調(diào)整之后的的腳本如下:

processid()
{
    ipid=$(ps -ef | grep -w $1 | tee out1 | grep -v grep | tee out2 | awk '{print $2}') | tee out3
    echo $ipid
}

case "$1" in
    i)
       processid $2
      ;;
    *)
        echo "parameter error..$1"
      ;;
esac

再次執(zhí)行腳本,本地會生成 out1 out2 out3 三個(gè)文件,記錄這管道命令的中間結(jié)果,下面是腳本執(zhí)行結(jié)果以及 out1 out2 out3 文件的內(nèi)容

[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 ~]$ 

原因

執(zhí)行腳本的時(shí)候,默認(rèn)會創(chuàng)建一個(gè)新的shell(也即一個(gè)新的進(jìn)程),上面的腳本 a.sh 就是在新的shell環(huán)境中執(zhí)行的。從上面的測試結(jié)果可以看出,ps -ef | grep -w zone9_log1 命令的結(jié)果中包含了執(zhí)行腳本身啟動的進(jìn)程和我們要查詢的目標(biāo)進(jìn)程,我們只需要過濾掉腳本本身的進(jìn)程,就可以得到準(zhǔn)確的進(jìn)程ID,調(diào)整之后的腳本如下(暫時(shí)先保留 tee命令輸出的中間結(jié)果):

processid()
{
    ipid=$(ps -ef | grep -w $1 | grep -v $0 | tee out1 | grep -v grep | tee out2 | awk '{print $2}') | tee out3
    echo $ipid
}

case "$1" in
    i)
       processid $2
      ;;
    *)
        echo "parameter error..$1"
      ;;
esac

上面processid函數(shù)中 grep -v $0 作用是過濾掉腳本的名字,其中 $0 表示腳本的名字 ( a.sh )

驗(yàn)證

再次執(zhí)行腳本,結(jié)果如下:

[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

從上面的測試結(jié)果中看出,最后輸出的結(jié)果是正確的

總結(jié)

多層管道在shell腳本中是很常見的用法,使用起來也非常方便和高效的,但是腳本一旦出問題調(diào)試就會變得困難起來,合理的使用 tee 命令輸出管道的中間結(jié)果,可以快速的定位問題所在

以上就是如何利用 tee 命令調(diào)試shell腳本中的管道的詳細(xì)內(nèi)容,更多關(guān)于tee 命令調(diào)試shell腳本中的管道的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • linux?shell字符串截取的詳細(xì)總結(jié)(實(shí)用!)

    linux?shell字符串截取的詳細(xì)總結(jié)(實(shí)用!)

    在開發(fā)的時(shí)候經(jīng)常會自行寫一些小的腳本,其中就用到截取字符串的操作,這篇文章主要給大家介紹了關(guān)于linux?shell字符串截取的詳細(xì)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 淺談Linux中的mkdir -p及基礎(chǔ)用法

    淺談Linux中的mkdir -p及基礎(chǔ)用法

    mkdir是一個(gè)用于創(chuàng)建目錄(目錄樹)的 Unix 和 Linux 命令, -p 選項(xiàng)允許創(chuàng)建一個(gè)目錄和它不存在的父目錄,這篇文章主要介紹了Linux中的mkdir -p,需要的朋友可以參考下
    2023-09-09
  • Linux 編程之進(jìn)程fork()詳解及實(shí)例

    Linux 編程之進(jìn)程fork()詳解及實(shí)例

    這篇文章主要介紹了Linux 編程之進(jìn)程fork()詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Shell過濾器的具體使用

    Shell過濾器的具體使用

    這篇文章主要介紹了Shell過濾器的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Linux Shell腳本系列教程(二):終端打印命令詳解

    Linux Shell腳本系列教程(二):終端打印命令詳解

    這篇文章主要介紹了Linux Shell腳本系列教程(二):終端打印命令詳解,本文著重講解了echo終端打印、printf終端打印兩個(gè)打印出輸出命令,需要的朋友可以參考下
    2015-06-06
  • Linux下利用Opencv打開筆記本攝像頭問題

    Linux下利用Opencv打開筆記本攝像頭問題

    這篇文章主要介紹了Linux下利用Opencv打開筆記本攝像頭問題,需要的朋友可以參考下
    2017-08-08
  • shell中set?-e的具體使用

    shell中set?-e的具體使用

    set?-e?是一個(gè)?Shell?命令,它用于在腳本運(yùn)行時(shí)自動退出,本文主要介紹了shell中set?-e的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Shell處理帶空格的文件名的方法

    Shell處理帶空格的文件名的方法

    這篇文章主要介紹了Shell處理帶空格的文件名的方法,文中總結(jié)了若干處理帶空格的文件名的技巧,需要的朋友可以參考下
    2014-06-06
  • Shell?iptales防火墻設(shè)置的方法步驟

    Shell?iptales防火墻設(shè)置的方法步驟

    本文主要介紹了Shell?iptales防火墻設(shè)置的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 用shell批量修改文件名的方法

    用shell批量修改文件名的方法

    這篇文章主要為大家介紹了shell對文件夾中全部文件的名稱加以批量替換、修改的方法,文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評論

额尔古纳市| 综艺| 靖远县| 崇州市| 湟中县| 兴山县| 商丘市| 克什克腾旗| 丹凤县| 龙江县| 万载县| 荔波县| 专栏| 姜堰市| 潮安县| 巴林右旗| 昌江| 柏乡县| 铁岭县| 宁波市| 陕西省| 长春市| 凤台县| 寻乌县| 宜黄县| 石狮市| 龙岩市| 婺源县| 青岛市| 海门市| 湖口县| 建瓯市| 靖江市| 高邮市| 乌什县| 德保县| 广饶县| 呼伦贝尔市| 河津市| 轮台县| 米泉市|