shell腳本中 /dev/null 的用法小結
/dev/null
是一個特殊的設備文件,它丟棄一切寫入其中的數據 可以將它 視為一個黑洞, 它等效於隻寫文件, 寫入其中的所有內容都會消失, 嘗試從中讀取或輸出不會有任何結果,同樣,/dev/null
在命令行和腳本中都非常有用
用途
/dev/null
通常被用於丟棄不需要的輸出流,或作為用於輸入流的空文件,這些操作通常由重定向完成,任何你想丟棄的數據都可以寫入其中
丟棄標準輸出
在寫shell腳本的時候,隻想通過命令的結果執行後面的邏輯,而不想命令執行過程中有一大堆中間結果輸出,這時候可以把命令執行過程中的輸入全部寫入 /dev/null
現有 a.sh
腳本,它的功能是判斷傳入的系統命令是否存在,腳本內容如下
#!/bin/bash command -v $1 if [[ $? -eq 0 ]]; then echo "command $1 exist..." else echo "command $1 not exist..." fi
執行 ./a.sh top
命令,輸出如下
[tt@ecs-centos-7 dev_test]$ ./a.sh top
/bin/top
command top exist…
說明: command -v 命令名
是查找指定命令名的命令是否存在,如果存在,輸出指定命令名的路徑,否則,不做任何輸出
$?
表示前一條命令的執行結果, 0 表示成功,其他表示失敗
腳本的執行結果中先輸出瞭 top
命令的路徑,緊接著輸出瞭top
命令存在的日志
把 command -v $1
的結果重定向到 /dev/null
可以屏蔽掉 top
命令路徑的輸出,調整之後的a.sh
內容如下
#!/bin/bash command -v $1 >/dev/null if [[ $? -eq 0 ]]; then echo "command $1 exist..." else echo "command $1 not exist..." fi
再次執行 ./a.sh top
,結果如下
[tt@ecs-centos-7 dev_test]$ ./a.sh top
command top exist…
[tt@ecs-centos-7 dev_test]$
從執行結果可以看出,把 command -v $1
的中間結果重定向到 /dev/null
之後,就不會再輸出top
命令的路徑瞭
而且,修改之後的腳本執行結果和原來的結果是一樣的
丟棄標準錯誤輸出
在shell腳本中,刪除一個文件的時候,需要先判斷文件是否存在,然後才能執行刪除操作,否則刪除的時候會輸出錯誤, 一般的刪除文件腳本內容如下:
#!/bin/bash if [ -f $1 ]; then rm $1 fi
可以通過把刪除命令的輸出重定向到 /dev/null
來避免輸出錯誤信息, 同時也不用判斷文件是否存在瞭, 調整之後的刪除腳本內容如下:
#!/bin/bash rm $1 >/dev/null 2>$1
分別執行命令 ./d.sh t1.txt
、./d.sh t2.txt
,結果如下:
[tt@ecs-centos-7 dev_test]$ ls t*.txt
t1.txt
[tt@ecs-centos-7 dev_test]$ ./d.sh t1.txt
[tt@ecs-centos-7 dev_test]$ ./d.sh t2.txt
[tt@ecs-centos-7 dev_test]$ ls t*.txt
ls: 無法訪問t*.txt: 沒有那個文件或目錄
t1.txt
文件位於當前目錄下,t2.txt
不存在,從執行結果可以看出,不管是刪除存在的文件還是不存在的文件都不會有錯誤輸出信息瞭
清空文件內容
清空文件內容有很多種方法,這裡介紹一種利用 /dev/null
清空文件內容的方法,具體的示例如下:
[tt@ecs-centos-7 dev_test]$ cat t.txt 123456 [tt@ecs-centos-7 dev_test]$ cat /dev/null > t.txt [tt@ecs-centos-7 dev_test]$ cat t.txt
日志的處理
在腳本中,為瞭方便調試,經常會加一些日志打印的邏輯,有時這種調試日志還比較多,腳本測試通過之後,這些調試日志可能就刪除或者註釋掉瞭
這裡提供一個小技巧,既不用刪除也不用註釋掉日志,同時執行腳本的時候還不會輸出這些調試日志
比如: 當前目錄有一個日志文件 log.txt
,腳本的調試日志會以 echo " this is debug log" >> log.txt
的形式寫入這個文件中
現在腳本功能測試通過瞭,調試日志不需要寫入log.txt
瞭
可以這麼做:原來的腳本原樣不動,本地先刪除 log.txt
,然後執行 ln -s /dev/null ./log.txt
命令,該命令建立瞭一個 log.txt
到 /dev/nulll
的軟連接,以後都有寫入 log.txt
的內容實際都會寫入 /dev/null
,而寫入 /dev/null
的所有內容都會被丟棄掉
如果後面需要再次調試腳本,刪除鏈接即可
到此這篇關於shell腳本中 /dev/null 的用途的文章就介紹到這瞭,更多相關shell腳本 /dev/null 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!