1、輸入輸出重定向
簡而言之,輸入重定向是指把文件導入到命令中,而輸出重定向則是指把原本要輸出到屏幕的數據信息寫入到指定文件中。
標準輸入重定向(STDIN,文件描述符為0):默認從鍵盤輸入,也可以從其他文件或命令輸入。
標準輸出重定向(STDOUT,文件描述符為1):默認輸出到屏幕。
錯誤輸出重定向(STDERR,文件描述符為2):默認輸出到屏幕。
比如我們分別查看兩個文件的屬性信息,其中第二個文件是不存在的,雖然針對這兩個文件的操作都分別會在屏幕上輸出一些數據信息,但這兩個操作的差異其實很大:
在上述命令中,名為linuxnb文件是存在的,輸出信息是該文件的一些相關權限、所有者、所屬組、文件大小及修改時間等信息,這也是該命令的標準輸出信息。而名為aaaaaa的第二個文件是不存在的,因此在執行完ls命令后顯示的報錯提示信息也是該命令的錯誤輸出信息。那么,要想把原本輸出到屏幕上的數據轉而寫入到文件當中,就要區別對待這兩種輸出信息。
對于輸入重定向來講,用到的符號及其作用如下圖
符合 | 作用 |
命令 <? 文件 | 將文件作為命令的標準輸入 |
命令 <<? 分界符 | 從標準輸入中讀入,直到遇見分界符才停止 |
命令? <? 文件1? > 文件2 | 將文件1作為命令的標準輸入并將標準輸出到文件2 |
對于輸出重定向來講,用到的符號及其作用如下圖
符號 | 作用 |
命令 >? 文件 | 將標準輸出重定向到一個文件中(清空原有文件的數據) |
命令 2> 文件 | 將錯誤輸出重定向到一個文件中(清空原有文件的數據) |
命令 >> 文件 | 將標準輸出重定向到一個文件中(追加到原有內容的后面) |
命令 2>> 文件 | 將錯誤輸出重定向到一個文件中(追加到原有內容的后面) |
命令 >> 文件 2>&1 或? 命令? &>> 文件 | 將標準輸出與錯誤輸出共同寫入到文件中(追加到原有內容的后面) |
對于重定向中的標準輸出模式,可以省略文件描述1不寫,而錯誤輸出模式的文件描述符2是必須要寫的
我們先簡單實際一下
通過標準重定向將man bash 命令原本輸出到屏幕的信息寫入到文件readme.txt中,然后顯示readme.txt文件中的內容
接下來嘗試輸出重定向技術中的覆蓋寫入和追加寫入,感受這兩種不同模式所帶來的變化
[root@bogon ~]# echo "Welcome to ShangHai" > readme.txt????? #覆蓋了原有文件的內容
[root@bogon ~]# echo "Welcome to GanSu" >> readme.txt???????? #追加到原有文件內容的后面
[root@bogon ~]# cat readme.txt??? #查看readme.txt內容
雖然都是輸出重定向技術,但是不同命令的標準輸出和錯誤輸出還是有區別的。例如查看當前目錄中某個文件的信息,這里以linuxnb文件為例。因為這個文件是真實存在的,因此使用標準輸出即可將原本要輸出到屏幕的信息寫入到文件中,而錯誤的輸出重定向則依然把信息輸出到屏幕上。
[root@bogon ~]# ls -l liunxnb
-rw-r--r--. 1 root root 0 3月? 22 23:01 liunxnb
[root@bogon ~]# ls -l liunxnb > /root/readme.txt
[root@bogon ~]# ls -l liunxnb 2> /root/readme.txt
-rw-r--r--. 1 root root 0 3月? 22 23:01 liunxnb
如果想把命令的報錯信息寫入到文件中,該怎么操作呢,當用戶執行一個自動化的Shell腳本時,這個操作會特別有用,而且特別實用,因為它可以把整個腳本執行過程中的報錯信息都記錄到文件中,便于安裝后的排錯工作。接下來我們以一個不存在的文件進行實驗演示:
[root@bogon ~]# ls -l? aaaaaa
ls: 無法訪問'aaaaaa': 沒有那個文件或目錄
[root@bogon ~]# ls -l aaaaaa > /root/readme.txt
ls: 無法訪問'aaaaaa': 沒有那個文件或目錄
[root@bogon ~]# ls -l aaaaaa 2> /root/readme.txt
[root@bogon ~]# cat? /root/readme.txt
ls: 無法訪問'aaaaaa': 沒有那個文件或目錄
[root@bogon ~]#
輸入重定向相對來說有些冷門,在工作中遇到的概率會小點。輸入重定向的作用是把文件直接導入命令中。接下來使用輸入重定向把readme.txt文件導入給wc -l 命令,統計一下文件中的內容行數。
[root@bogon ~]# wc -l < readme.txt
1
[root@bogon ~]#
2、管道命令符
管道命令符的作用也可以用一句話來概括"把前一個命令原本要輸出到屏幕的標準正常數據當作是后一個命令的標準輸入"
這個管道符就很方便,我們可以將它套用到其他不同的命令上。比如用翻頁的形式查看/etc目錄中的文件列表及屬性
修改密碼時,通常都要輸入兩次密碼以進行確認,這在編寫自動化腳本時將成為一個非常致命的缺陷。通過管道符和passwd命令的 --stdin 參數相結合。我們可以用一條命令來完成密碼重置操作。
[root@bogon ~]# echo "12345" | passwd --stdin root
更改用戶 root 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
管道符的運用千變萬化,剩下的就是要我們通過學習和經驗去實踐操作,去發現。
3、命令行的通配符
顧名思義,通配符就是通用的匹配信息的符號,
比如星號(*)代表匹配0個或多個字符
問號(?)代表匹配單個字符
中括號內加上數字[0-9]代表匹配0~9直接的單個數字的字符,而中括號內加上字母[abc]則代表匹配a,b,c三個字符中的任意一個字符。
[root@bogon ~]# ls -l /etc/v*
-rw-r--r--. 1 root root?? 28 3月? 17 09:32 /etc/vconsole.conf
-rw-r--r--. 1 root root 1982 12月? 6 2018 /etc/vimrc
-rw-r--r--. 1 root root 1204 12月? 6 2018 /etc/virc
如果只想查看以某個字符為開頭的,就要用到問號了
除了使用[0-9]來匹配0~9之間的單個數字,也可以用[135]這樣的方式僅匹配這三個指定數字中的一個,若沒有匹配到,則不會顯示出來
4、常用的轉義字符
為了能夠更好地理解用戶的表達,Shell解釋器還提供了特別豐富的轉義字符來處理輸入的特殊數據。
反斜杠(\):使反斜杠后面一個變量變為單純的字符串。
單引號("):轉義其中所有的變量為單純的字符串。
雙引號(""):保留其中的變量屬性,不進行轉義處理。
反引號(``):把其中的命令執行后返回結果。
我們先定義一個名為PRICE的變量并賦值為5.然后輸出以雙引號括起來的字符串與變量信息:
接下來,我們希望能輸出“Price is $5”,即價格是5美元的字符串內容,但碰巧美元符號與變量提取符號合并后的$$作用是顯示當前程序的進程ID號碼,于是命令執行后輸出的內容并不是我們所預期的:
要想讓第一個“$”乖乖地作為美元符號,那么就需要使用反斜杠(\)來進行轉義,將這個命令提取符轉義成單純的文本,去除其特殊的功能。
而如果只需要某個命令的輸出值時,可以像`命令`這樣,將命令用反引號括起來,達到預期的效果。例如,將反引號與uname -a 命令結合,然后使用echo命令來查看本機Linux版本和內核信息:
5、重要的環境變量
變量是計算機系統用于保持可變值的數據類型。在Linux系統中,變量名稱一般都是大寫的,這是一種規范。我們可以直接通過變量名稱來提取到對應的變量值。Linux系統中的環境變量是用來定義系統運行環境的一些參數,比如每個用戶不同的家目錄、郵件存放位置等。
那么,命令在Linux中的執行分為4個步驟:
第一步:判斷用戶是否以絕對路徑或相對路徑的方式輸入命令(如/bin/ls),如果是的話,則直接執行。
第二步:Linux系統檢查用戶輸入的命令是否為“別名命令”,即用一個自定義的命令名稱來替換原本的命令名稱。可以用alias命令來創建一個屬于自己的命令別名,格式為“alias 別名=命令”。若要取消一個命令別名,則是用unalias命令,格式為“unalias 別名”。
第三步:Bash解釋器判斷用戶輸入的是內部命令還是外部命令。內部命令是解釋器內部的指令,會被直接執行;而用戶在絕大部分時間輸入的是外部命令,這些命令交給第四步繼續處理。可以使用“type 命令名稱”來判斷用戶輸入命令是內部還是外部命令。
第四步:系統在多個路徑中查找用戶輸入的命令文件,而定義這些路徑的變量叫做PATH,可以簡單地把它理解成是小助手,作用是告訴Bash解釋器待執行的命令可能存放的位置,然后Bash解釋器就會去這些位置尋找。PATH是由多個路徑值組成的變量,每個路徑直接用冒號間隔,對這些路徑的增加和刪除操作將影響到Bash解釋器對Linux命令的查找。
linux系統中重要的10個環境變量
變量名稱 | 作用 |
HOME | 用戶的主目錄(即家目錄) |
SHELL | 用戶使用的Shell解釋器名稱 |
HISTSIZE | 輸出的歷史命令記錄條數 |
HISTFILESIZE | 保存的歷史命令記錄條數 |
MALL | 郵件保持路徑 |
LANG | 系統語言、語系名稱 |
RANDOM | 生成一個隨機數字 |
PS1 | Bash解釋器的提示符 |
PATH | 定義解釋器搜索用戶執行命令的路徑 |
EDITOR | 用戶默認的文本編輯器 |
其實變量是由固定的變量名與用戶系統設置的變量值兩部分組成的,我們完全可以自行創建變量,來滿足工作需求。例如設置一個名稱為WORKDIR的變量,方便用戶輕松地進入一個層次較深的目錄:
但是,這樣的變量不具有全局性,作用范圍有限,默認情況下不能被其他用戶使用。如果工作需要,可以使用export命令將其提升為全局變量,這樣其他用戶也可以使用它了。