Shell指令碼中的 /Dev/Null 用途
導讀 | /dev/null 是一個特殊的裝置檔案,它丟棄一切寫入其中的資料 可以將它 視為一個黑洞, 它等效於只寫檔案, 寫入其中的所有內容都會消失, 嘗試從中讀取或輸出不會有任何結果,同樣,/dev/null 在 行和 中都非常有用。 |
/dev/null 是一個特殊的裝置檔案,它丟棄一切寫入其中的資料 可以將它 視為一個黑洞, 它等效於只寫檔案, 寫入其中的所有內容都會消失, 嘗試從中讀取或輸出不會有任何結果,同樣,/dev/null 在 行和 中都非常有用
/dev/null 通常被用於丟棄不需要的輸出流,或作為用於輸入流的空檔案,這些操作通常由重定向完成,任何你想丟棄的資料都可以寫入其中
丟棄標準輸出
在寫 指令碼的時候,只想透過命令的結果執行後面的邏輯,而不想命令執行過程中有一大堆中間結果輸出,這時候可以把命令執行過程中的輸入全部寫入 /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 的所有內容都會被丟棄掉
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2746039/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell指令碼中/dev/null 2>&1詳解指令碼devNull
- [shell]>/dev/null 2>&1 的作用devNull
- shell 中的>/dev/null 2>&1 是什麼鬼?devNull
- Difference between 2>&-, 2>/dev/null, |&, &>/dev/null, >/dev/null, 2>&1devNull
- 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的區別devNull
- Linux Shell 1>/dev/null 2>&1 含義LinuxdevNull
- /dev/zero和/dev/null的區別devNull
- linux shell指令碼中 =~ 的作用Linux指令碼
- 【Shell】使用Shell指令碼快速完成SQL指令碼中重複枯燥的任務指令碼SQL
- 9、在Shell指令碼中呼叫其他指令碼指令碼
- Shell指令碼中cd命令使用指令碼
- Shell標準輸出、標準錯誤 >/dev/null 2>&1devNull
- 如何呼叫python中的shell指令碼?Python指令碼
- >/dev/null 2>&1devNull
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- Linux/Unix shell 指令碼中呼叫SQL,RMAN指令碼Linux指令碼SQL
- shell指令碼指令碼
- shell指令碼中cd命令無效指令碼
- shell指令碼中的變數及應用指令碼變數
- 注意shell指令碼中ps -ef|grep的坑指令碼
- Shell 指令碼中的exit狀態解釋指令碼
- 重建/dev/null檔案devNull
- [Shell] Shell 生成 HTML指令碼HTML指令碼
- 什麼是shell?Linux中shell有什麼用途?Linux
- [轉] linux下 /dev/null與/dev/zero的區別LinuxdevNull
- Bash Shell指令碼中的陣列使用例項指令碼陣列
- 理解 shell 指令碼中的常見用法: 2>&1指令碼
- Shell指令碼中傳送html郵件的方法指令碼HTML
- shell指令碼中不識別source命令指令碼
- shell指令碼(二)指令碼
- shell指令碼心得指令碼
- shell指令碼案例指令碼
- 巧用shell指令碼生成快捷指令碼指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- /dev/null解決辦法devNull
- /dev/null和標準*使用devNull
- 程式碼上線的shell指令碼指令碼
- Linux shell程式設計(一)shell指令碼中的變數詳解Linux程式設計指令碼變數