Linux 之 Bash -- 數據流重導向

1.數據流重導向

數據流重導向就是將某個指令執行後應該要出現在屏幕上的數據,給他傳輸到其他的地方。(在Linux的文本模式底下很重要)
我們借鳥哥的圖理解一下 :STDIN(Standard input);STDOUT(Standard output);STDERR(Standard error output)



standard output 即標準輸出:指的是指令執行所回傳的正確的訊息
standard error output 即標準錯誤輸出:可以理解爲“指令執行失敗後,所回傳的正確的訊息”

在這裏插播一下find的用法
find + 路徑 + '-name' +'file name' 就可以把指定路徑下的具有此文件名的文件和其相對路徑打印到屏幕上

來看一個數據流重導向的例子~
find /home -name .bashrc 翻譯成人話就是 幫我找一下home路徑下文件名爲.bashrc的文件,然後打印出來
如果home路徑下確實有.bashrc,那麼輸出即爲標準輸出1
如果home路徑下沒有.bashrc,那麼輸出即爲標準輸出2
除了考慮文件的存在性之外,還有一個問題:/home底下有你自己的賬號,也有之前建立的其他人的賬號啊,其他人賬號的家目錄你是沒有權限進入的,因此肯定會出現一堆類似'find: /root: Permission denied'之類的訊息。
所以我們需要將stdout 與 stderr 分存到不同的文件去,纔會使屏幕不那麼亂。find /home -name .bashrc > list_right 2> list_error(注意:這裏2和>之間是沒有空格的)
這樣的話數據就可以從 list_right 和 list_error裏查看信息。
但是,如果我不想輸出這些error信息,而是想讓它們躺到類似Windows裏的回收站裏哩?
這裏就要認識Linux的垃圾桶 /dev/null啦~
/dev/null可以吃掉任何導向這個裝置的信息
就像這樣:find /home -name .bashrc 2> /dev/null 把find過程中出現的error信息統統放到回收站去。
但是我如果想讓STDOUT和STDERR都放到同一個文件呢?
我們在小白的認知層次上首先能想到的邏輯是這樣的:
find /home -name .bashrc > list 2> list
這麼做其實不會卡殼,也會有輸出,只是erro信息會參差不齊得插入到list文本里,如果想讓最後的結果看起來更整潔,還是使用特殊符號吧~
find /home -name .bashrc > list 2>&1 或者 find /home -name .bashrc &> list
這樣就可以保證正確信息輸出完畢後,再將過程中產生的erro信息統一增加到當前文本的最後面。

什麼是standard input?(stdin)

  • < 將原本需要由鍵盤輸入的數據,改由文件內容來取代
    例如 cat > catfile < ~/.bashrc 就是將~/.bashrc的內容輸入到catfile中去(在類似mail這種指令的使用上非常有幫助)
  • << 代表的是“結束的輸入字符”
    cat > catfile << "eof"情況下,可以直接在鍵盤輸入eof代替“ctrl+d”來結束(~~呵呵,是不是很雞肋~~)

2.教你一次執行多個指令(符號版本)

一次性執行多項任務,最方便的就是撰寫腳本去執行,額~,這就要學習shell script啦,panda還不會,期待有夥伴們多多評論,多多鼓勵,我們一起把這個專題學下去~

2.1 使用分號;

指令和指令中間用分號;來隔開,分號前的指令執行完後就會立刻執行後面的指令,即command1;command2這種形式
特點:前面的command1執行完成後就會立刻執行command2,所以使用時存在一定侷限性

2.2 使用判斷符號 &&||

它們是根據 指令回傳值 來確定後面的命令是否要繼續執行的
指令回傳值$?
如果前一個指令執行的結果爲正確,在Linux底下會回傳一個$?=0的值
&& 和 || 就是根據指令回傳值判斷command2是否執行的

下面 command 簡寫爲 cmd👇


linux最怕紙上談兵了,panda下面列了9張圖,共4步小操作,在實操中認識&&||,不要偷懶~

  • step1.確保該目錄下沒有名爲file的目錄
    這裏使用ls判斷目錄是否存在,從而獲得Linux的指令回傳值:如果存在,Linux的指令回傳值$?=0;反之則不爲0(這個回傳值不會直接輸出到屏幕上)
  • step2. 作瞎得玩玩&&
    通過前面知道,&&後面的command只有在前面的指令回傳值$?=0時才能被執行,因此ls file && mkdir file(當前目錄下是沒有file目錄的)是一條無效的指令👇

    由於command1的指令回傳值非0,因此無法執行mkdir file,ls file也就顯示沒有該目錄
  • step3. 試試||
    ls file || mkdir file
    由於該目錄下沒有file目錄,因此前一個命令的指令回傳值不爲0,從而執行mkdir file

    通過tree指令可以查看目錄結構,可以看到command2執行操作了
  • step4. &&||一起用
    ls file || mkdir file && mkdir file/filename
    由於當前目錄不存在/file,ls file指令回傳值$?不爲0,從而執行mkdir file(指令回傳值爲0);然後,繼續執行mkdir file/filename

    tree查看一下file,發現已經成功創建 file/filename

由於指令是一個接着一個去執行的,因此,如果真要使用判斷,那麼這個&&||的順序就不能搞錯,一般來說假設判斷式有3個: command 1 && command 2 || command 3,而且順序通常不會變,因爲一般來說,command2與command3會放置肯定可以執行成功的指令。

好啦,關於Linux的數據流重導向就這麼多了,明後天寫一下管線命令

postscript:
“我纔不管有沒有file這個目錄,我就是要創建/file/filename”可以這麼試試
ls file && mkdir file/filename || mkdir file && mkdir file/filename
想看一下執行後的結果?tree file試試~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章