Linux關於Bash的重定向問題(>/dtc/null 2>&1)

起因

博主對於Linux系統基本不是太熟悉,在啓動ES執行./elasticsearch &發現的這個問題,es啓動完畢之後,打算啓動kibana發現es的日誌一直在打印,雖然後臺啓動了,但是影響我輸入其他命令。於是就請教大佬、網上巴拉資料。然後才發現是命令少寫,應該寫成./elasticsearch & >/etc/null 2>&1。其實也不能算少寫,./elasticsearch &這個命令就是後臺啓動,但是相應日誌會輸入到當前控制檯,因爲它指向標準輸入stdout。最終輸入這個./elasticsearch & >/etc/null 2>&1命令之後,日誌果然不會打印在控制檯了。

資料搜索

名詞解釋

根據上面的關鍵詞,查到的資料進行總結。
/etc/null:這是隻能寫但是讀不到任何信息一個比較奇怪的文件,可以把它當成一個垃圾焚燒爐,任何信息到了它着都會被銷燬。
>:這個指代的是重定向或指向的意思,前者指向後者。
&:因爲>指向的一般會默認爲一個文件,在這裏&符號爲了修飾“1”指代的是標準輸出的操作描述符,而不是名稱爲“1”的文件。(後面代碼會有演示)
還有就是bash有三種文件描述符:

英文 解釋 代表值
stdin 標準輸出 0
stdout 標準輸出 1
stderr 標準錯誤 2

這三者都是終端輸入和輸出(stderr也屬於輸出)。

好了那我們來解釋一下這句代碼./elasticsearch & >/etc/null 2>&1是什麼意思。首先命令從左往右執行,./elasticsearch & 是啓動後端啓動ES,>/etc/null是標準輸出重定向到/etc/null文件,通俗說就是輸出語句輸出到/etc/null文件。2>&1是標準錯誤重定向到標準輸出指向的位置。而標準輸出指向的剛好是/etc/null,所以標準輸出和錯誤都會寫入到/etc/null,不會在控制檯顯示。

具體實踐

接下來具體代碼操作一波:

1.首先看一下>的使用效果

輸入:(echo "stdout";echo "stderr")會輸出在控制檯上這兩個字符串(ps:默認echo輸出屬於是標註輸出)

2.然後加上重定向符號

可以看到在控制檯上並沒有輸出這兩個字符串,因爲被重定向到了名稱爲“1”的文件。
在這裏插入圖片描述

3.再看加上&符號的情況

這時候1因爲有&的修飾,所以是指向了標準輸出,也就輸出在當前控制檯。
在這裏插入圖片描述

4.同樣指向標準錯誤也是一樣的

在這裏插入圖片描述

5.再來驗證一下/dtc/null

重定向到該文件下,控制檯這個時候並沒有顯示什麼而是輸出結果都到了/etc/null文件
在這裏插入圖片描述

6.現在想辦法往最初的那個代碼上靠攏一下

同樣代碼,我把echo "stderr"指向標準錯誤,做一下對比。這個時候同樣輸出了這兩個字符串,但是他們的指向已經發生改變了,stderr已經重定向到了標準錯誤
在這裏插入圖片描述

7.然後把這個在重定向到/etc/null,看一下控制檯輸出的結果

在這裏插入圖片描述
what???這是什麼鬼?不應該都不輸出的嗎?

這個時候就要具體解釋一下了,首先bash命令從左往右依次執行,小括號裏面的值雖然不變,但是指向已經發生改變了,stderr已經指向標準錯誤,而>/etc/null其實少寫了一個1,應該是1>/etc/null,意思是將標準輸出指向/etc/null,所以說只有標準輸出的才指向了/etc/null,標準錯誤自然而然的就輸出出來了

8.重頭戲來了,變形一下./elasticsearch & >/etc/null 2>&1這個代碼

做個簡單推斷,因爲./elasticsearch & >/etc/null 2>&1這個代碼沒有輸出,所以變形後也會不輸出,那最終效果如何呢?
在這裏插入圖片描述
這個時候發現,果然都沒有輸出,和推斷基本吻合,這個時候結合前面的解釋,在解釋一下這句代碼。
小括號裏面的值,stdout指向了標準輸出,stderr已經指向標準錯誤,執行>/etc/null,這個的時候,標準輸出已經指向了/etc/null文件,接着往後走,2>&1這句話的意思是,標準錯誤指向標準輸出,這個時候標準輸出已經在前面指向/etc/null文件,所以標準錯誤也指向了/etc/null文件,最終什麼也不輸出。
可以通過一張圖來理解這個操作:

自我檢測

如果感覺已經理解了,挑戰一下看看自己理解
1.結合上一個代碼,我們調換一下位置(echo "stdout";echo "stderr">&2) 2>&1 >/etc/null,會發生什麼呢?
2.輸入命令ls xxx >&1ls xxx >&2ls >&1ls >&2會有什麼結果呢?

參考資料

文末安利

嘯引九霄伏龍起,愁披天地劍霜吟。
今朝鵬翼蓋古今,一輪俠刀蜀道行。
                                      ----霹靂布袋戲——俠刀 蜀道行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章