Shell指令碼中的 Dev Null 用途

2022-05-23 12:12:09 字數 2901 閱讀 1630

/dev/null 是乙個特殊的裝置檔案,它丟棄一切寫入其中的資料 可以將它 視為乙個黑洞, 它等效於只寫檔案, 寫入其中的所有內容都會消失, 嘗試從中讀取或輸出不會有任何結果,同樣,/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: 沒有那個檔案或目錄

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指令碼中的函式, shell中的陣列

示例1 bin bash 函式的使用 input input 1 a b root second fun.sh 1 a 3 fun.sh 示例2 bin bash 傳遞乙個引數給函式 input read p please input n input root second fun.sh pleas...

shell指令碼中的變數

1 在命令列中和指令碼中,變數定義得格式 name value 左右兩邊不能有空格,否則會當做命令來對待,輸出乙個command not found echo name echo 列印出變數,引用變數使用 name.2 單引號和雙引號 語法 和php中相同 雙引號仍然可以保有變數的內容,但單引號內僅...

shell指令碼中的陣列

以下命令,都是以陣列array 20150417 20150416 20150415 為例。注意bash中只支援一維陣列,沒有限定陣列的大小。類似與c語言,陣列元素的下標由0開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於0。陣列定義 說明 陣列元素的間隔符可以是空...