Linux就該這麼學【Part three:管道符、重定向與環境變量】

3.1 輸入輸出重定向

輸入重定向是指把文件導入到命令中
輸出重定向則是指把原本要輸出到屏幕的數據信息寫入到指定文件中
輸出重定向分爲了標準輸出重定向和錯誤輸出重定向兩種不同的技術,以及清空寫入與追加寫入兩種模式

標準輸入重定向(STDIN,文件描述符爲0):默認從鍵盤輸入,也可從其他文件或命令中輸入。
標準輸出重定向(STDOUT,文件描述符爲1):默認輸出到屏幕。
錯誤輸出重定向(STDERR,文件描述符爲2):默認輸出到屏幕。

比如我們分別查看兩個文件的屬性信息,其中第二個文件是不存在的,雖然針對這兩個文件的操作都分別會在屏幕上輸出一些數據信息,但這兩個操作的差異其實很大:

在這裏插入圖片描述

  • 輸入重定向
    命令 < 文件 將文件作爲命令的標準輸入
    命令 << 分界符 從標準輸入中讀入,直到遇見分界符才停止
    命令 < 文件1 > 文件2 將文件1作爲命令的標準輸入並將標準輸出到文件2
    對於輸出重定向來講,用到的符號及其作用如表3-2所示。

  • 輸出重定向
    命令 > 文件 將標準輸出重定向到一個文件中(清空原有文件的數據)
    命令 2> 文件 將錯誤輸出重定向到一個文件中(清空原有文件的數據)
    命令 >> 文件 將標準輸出重定向到一個文件中(追加到原有內容的後面)
    命令 2>> 文件 將錯誤輸出重定向到一個文件中(追加到原有內容的後面)
    命令 >> 文件 2>&1命令 &>> 文件 將標準輸出與錯誤輸出共同寫入到文件中(追加到原有內容的後面)
    對於重定向中的標準輸出模式,可以省略文件描述符1不寫,而錯誤輸出模式的文件描述符2是必須要寫的

通過標準輸出重定向將man bash命令原本要輸出到屏幕的信息寫入到文件readme.txt中,然後顯示readme.txt文件中的內容。
在這裏插入圖片描述

我們接下來嘗試輸出重定向技術中的覆蓋寫入與追加寫入這兩種不同模式帶來的變化。首先通過覆蓋寫入模式向readme.txt文件寫入一行數據(該文件中包含上一個實驗的man命令信息),然後再通過追加寫入模式向文件再寫入一次數據
在這裏插入圖片描述

雖然都是輸出重定向技術,但是不同命令的標準輸出和錯誤輸出還是有區別的。例如查看當前目錄中某個文件的信息,這裏以linuxprobe文件爲例。因爲這個文件是真實存在的,因此使用標準輸出即可將原本要輸出到屏幕的信息寫入到文件中,而錯誤的輸出重定向則依然把信息輸出到了屏幕上。
total:佔的空間大小,單位爲KB,爲4的整數倍。文件不足4K,按4k統計
列表中所有文件的磁盤空間佔用總和,也就是資源佔用總和,它的統計單位是kb。
在這裏插入圖片描述

如果想把命令的報錯信息寫入到文件,該怎麼操作呢?當用戶在執行一個自動化的Shell腳本時,這個操作會特別有用,而且特別實用,因爲它可以把整個腳本執行過程中的報錯信息都記錄到文件中,便於安裝後的排錯工作。接下來我們以一個不存在的文件進行實驗演示:

在這裏插入圖片描述

重定向的作用是把文件直接導入到命令中。接下來使用輸入重定向把readme.txt文件導入給wc -l命令,統計一下文件中的內容行數。

在這裏插入圖片描述

3.2 管道命令符

把前一個命令原本要輸出到屏幕的標準正常數據當作是後一個命令的標準輸入
在這裏插入圖片描述

在這裏插入圖片描述

在修改用戶密碼時,通常都需要輸入兩次密碼以進行確認,這在編寫自動化腳本時將成爲一個非常致命的缺陷。通過把管道符和passwd命令的–stdin參數相結合,我們可以用一條命令來完成密碼重置操作:

通過echo “password” |passwd --stdin user命令改密碼引發的問題
在這裏插入圖片描述

在這裏插入圖片描述

3.3 命令行的通配符

假設想要批量查看所有硬盤文件的相關權限屬性,一種方式是這樣的:
在這裏插入圖片描述

通配符就是通用的匹配信息的符號
星號(*)代表匹配零個或多個字符
問號(?)代表匹配單個字符
中括號內加上數字[0-9]代表匹配0~9之間的單個數字的字符
中括號內加上字母[abc]則是代表匹配a、b、c三個字符中的任意一個字符

在這裏插入圖片描述

3.4 常用的轉義字符

反斜槓(\):使反斜槓後面的一個變量變爲單純的字符串。
單引號(''):轉義其中所有的變量爲單純的字符串。
雙引號(""):保留其中的變量屬性,不進行轉義處理。
反引號(``):把其中的命令執行後返回結果。

在這裏插入圖片描述

需要某個命令的輸出值時,可以像命令這樣,將命令用反引號括起來,達到預期的效果。例如,將反引號與uname -a命令結合,然後使用echo命令來查看本機的Linux版本和內核信息:

在這裏插入圖片描述

3.5 重要的環境變量

第1步:判斷用戶是否以絕對路徑或相對路徑的方式輸入命令(如/bin/ls),如果是的話則直接執行。

第2步:Linux系統檢查用戶輸入的命令是否爲“別名命令”,即用一個自定義的命令名稱來替換原本的命令名稱。可以用alias命令來創建一個屬於自己的命令別名,格式爲“alias 別名=命令”。若要取消一個命令別名,則是用unalias命令,格式爲“unalias 別名”。我們之前在使用rm命令刪除文件時,Linux系統都會要求我們再確認是否執行刪除操作,其實這就是Linux系統爲了防止用戶誤刪除文件而特意設置的rm別名命令,接下來我們把它取消掉:
在這裏插入圖片描述

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

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

在這裏插入圖片描述
這裏有比較經典的問題:“爲什麼不能將當前目錄(.)添加到PATH中呢? ” 原因是,儘管可以將當前目錄(.)添加到PATH變量中,從而在某些情況下可以讓用戶免去輸入命令所在路徑的麻煩。但是,如果黑客在比較常用的公共目錄/tmp中存放了一個與ls或cd命令同名的木馬文件,而用戶又恰巧在公共目錄中執行了這些命令,那麼就極有可能中招了。

所以,作爲一名態度謹慎、有經驗的運維人員,在接手了一臺Linux系統後一定會在執行命令前先檢查PATH變量中是否有可疑的目錄,另外讀者從前面的PATH變量示例中是否也感覺到環境變量特別有用呢。我們可以使用env命令來查看到Linux系統中所有的環境變量

HOME 用戶的主目錄(即家目錄)
SHELL 用戶在使用的Shell解釋器名稱
HISTSIZE 輸出的歷史命令記錄條數
HISTFILESIZE 保存的歷史命令記錄條數
MAIL 郵件保存路徑
LANG 系統語言、語系名稱
RANDOM 生成一個隨機數字
PS1 Bash解釋器的提示符
PATH 定義解釋器搜索用戶執行命令的路徑
EDITOR 用戶默認的文本編輯器

我們使用下述命令來查看HOME變量在不同用戶身份下都有哪些值
在這裏插入圖片描述

其實變量是由固定的變量名與用戶或系統設置的變量值兩部分組成的,我們完全可以自行創建變量,來滿足工作需求。例如設置一個名稱爲WORKDIR的變量,方便用戶更輕鬆地進入一個層次較深的目錄:
在這裏插入圖片描述

但是,這樣的變量不具有全局性,作用範圍也有限,默認情況下不能被其他用戶使用。如果工作需要,可以使用export命令將其提升爲全局變量,這樣其他用戶也就可以使用它了:

在這裏插入圖片描述

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