1. 程式人生 > 其它 >管道符、重定向和環境變數

管道符、重定向和環境變數

一、輸入重定向和輸出重定向
輸入重定向就是把檔案作為命令的引數,輸出重定向就是把原本要輸出到螢幕上的內容寫到檔案裡面。

(1)輸入重定向:

(2)輸出重定向;

對於重定向中的標準輸出模式,可以省略檔案描述符1不寫,而錯誤輸出模式的檔案描述符2是必須要寫的。
示例:

重定向中的覆蓋寫入和追加寫入的不同:
覆蓋寫入就是清除原有資料,只保留最後一次的輸入;追加寫入就是保留原來的資料在後面新增後來的資料

雖然都是輸出重定向,但是標準輸出和錯誤輸出還是有區別的。如果檔案存在則輸出檔案內容,如果不存在則錯誤訊息會輸出到螢幕,
如何把建立檔案時的錯誤訊息也寫入呢?示例如下

還有一種常見情況,就是我們想不區分標準輸出和錯誤輸出,只要命令有輸出資訊則全部追加寫入到檔案中。這就要用到&>>操作符了:

二、管道符命令


其執行格式為“命令A | 命令B”。管道命令符的作用也可以用一句話概括為“把前一個命令原本要輸出到螢幕的資訊當作後一個命令的標準輸入
在修改使用者密碼時,通常都需要輸入兩次密碼以進行確認,這在編寫自動化指令碼時將成為一個非常致命的缺陷。通過把管道符和passwd命令的--stdin
引數相結合,可以用一條命令來完成密碼重置操作:

如果需要將管道符處理後的結果既輸出到螢幕,又同時寫入到檔案中,則可以與tee命令結合使用。

命令萬用字元
顧名思義,萬用字元就是通用的匹配資訊的符號,比如星號(*)代表匹配零個或多個字元,問號(?)代表匹配單個字元,中括號內加上數字[0-9]代表匹配
0~9之間的單個數字的字元,而中括號內加上字母[abc]則是代表匹配a、b、c三個字元中的任意一個字元。

示例:
匹配所有在/dev目錄中且以loop開頭的檔案:

如果只想檢視檔名以ram開頭,但是後面還緊跟其他某一個字元的檔案的相關資訊,這時就需要用到問號來進行通配了

萬用字元不僅可用於搜尋檔案或代替被通配的字元,還可以與建立檔案的命令相結合,一口氣創建出好多個檔案。不過在建立多個檔案時,需要使用大括號,
並且欄位之間用逗號間隔:

轉義字元

四個常見的轉義字元:

我們先定義一個名為number的變數並賦值為5,然後輸出以雙引號括起來的字串與變數資訊:

而如果只需要某個命令的輸出值,可以像命令這樣,將命令用反引號括起來,達到預期的效果。例如,將反引號與uname -a命令結合,然後使用echo命令
來檢視本機的Linux版本和核心資訊:

三、環境變數
在Linux系統中,變數名稱一般都是大寫的,命令則都是小寫的,這是一種約定俗成的規範。Linux系統中的環境變數是用來定義系統執行環境的一些引數,比如每個使用者不同的家目錄、郵件存放位置等。可以直接通過變數名稱來提取到對應的變數值。
為了更好地幫助大家理解變數的作用,給大家舉個例子。前文中曾經講到,在Linux系統中一切都是檔案,Linux命令也不例外。那麼,在使用者執行了一條命令之後,Linux系統中到底發生了什麼事情呢?簡單來說,命令在Linux中的執行分為4個步驟。
第1步:判斷使用者是否以絕對路徑或相對路徑的方式輸入命令(如/bin/ls),如果是絕對路徑則直接執行,否則進入第2步繼續判斷。
第2步:Linux系統檢查使用者輸入的命令是否為“別名命令”,即用一個自定義的命令名稱來替換原本的命令名稱。
使用rm命令刪除檔案時,Linux系統都會要求使用者確認是否執行刪除操作,其實這就是Linux系統為了防止使用者誤刪除檔案而特意設定的rm別名命令—“rm -i”。

可以用alias命令來建立一個屬於自己的命令別名,語法格式為“alias別名=命令”。若要取消一個命令別名,則是用unalias命令,語法格式為“unalias別名”。

第3步:Bash直譯器判斷使用者輸入的是內部命令還是外部命令。內部命令是直譯器內部的指令,會被直接執行;而使用者在絕大部分時間輸入的是外部命令,這些命令交由步驟4繼續處理。可以使用“type命令名稱”來判斷使用者輸入的命令是內部命令還是外部命令:

第4步:系統在多個路徑中查詢使用者輸入的命令檔案,而定義這些路徑的變數叫作PATH,可以簡單地把它理解成是“直譯器的小助手”,作用是告訴Bash直譯器待執行的命令可能存放的位置,然後Bash直譯器就會乖乖地在這些位置中逐個查詢。PATH是由多個路徑值組成的變數,每個路徑值之間用冒號間隔,對這些路徑的增加和刪除操作將影響到Bash直譯器對Linux命令的查詢。

常見環境變數:

Linux作為一個多使用者、多工的作業系統,能夠為每個使用者提供獨立的、合適的工作執行環境。因此,一個相同的變數會因為使用者身份的不同而具有不同的值。

其實變數是由固定的變數名與使用者或系統設定的變數值兩部分組成的,我們完全可以自行建立變數來滿足工作需求。例如,設定一個名稱為WORKDIR的變數,方便使用者更輕鬆地進入一個層次較深的目錄:

但是這樣的變數不具有全域性性,如果工作需要,可以使用export命令將其提升為全域性變數,這樣其他使用者也就可以使用它了:
後續要是不使用這個變量了,則可執行unset命令把它取消掉: