1. 程式人生 > 其它 >管道符、重定向與環境變數(Linux就該這麼學第三章)

管道符、重定向與環境變數(Linux就該這麼學第三章)

第三章

3.1 輸入輸出重定向

  1. 輸入重定向是指把檔案匯入到命令中,而輸出重定向則是指把原本要輸入到螢幕的資料資訊寫入到指定檔案中。
  2. 輸出重定向分為標準輸出重定向和錯誤輸出重定向兩種不同的技術,以及清空寫入和追加寫入兩種模式。
  • 標準輸入重定向(STDIN,檔案描述符為0):預設從鍵盤輸入,也可以從其他檔案或命令重輸入
  • 標準輸出重定向(STDOUT,檔案描述符為1):預設輸出到螢幕
  • 錯誤輸出重定向(STDERR,檔案描述符為2):預設輸出到螢幕
  1. 輸入重定向符號及作用
    • 命令 < 檔案:將檔案作為命令的標準輸入
    • 命令 << 分界符:從標準輸入中讀入,知道遇見分界符才停止
    • 命令 < 檔案1 > 檔案2:將檔案1作為命令的標準輸入並將標準輸出到檔案2
  2. 輸出重定向符號及作用
    • 命令 > 檔案:將標準輸出重定向到一個檔案中(清空原檔案資料)
    • 命令 2> 檔案:將錯誤輸出重定向到一個檔案中(清空原檔案資料)
    • 命令 >> 檔案:將標準輸出重定向向到檔案中(追加到原有內容後面)
    • 命令 2>> 檔案:將標準錯誤...
    • 命令 &>> 檔案:將標準輸出與錯誤輸出共同寫入檔案中(追加)

3.2 管道符命令

  1. 管道符的作用是“把前一個命令原本要輸出到螢幕的標準正常資料當做是後一個命令的標準輸入”

  2. 在Liunx中同時按下鍵盤 Shift + \ 可以輸入管道符,執行格式為“命令A | 命令B”

  3. 例子:

    • 統計被限制登入使用者個數命令

      grep "/sbin/nologin" /etc/passwd | wc -l

    • 用翻譯的形式檢視/etc目錄中的檔案列表及屬性

      ls -l /etc/ | more

    • 通道符和passwd命令的--stdin引數結合,用一條命令完成密碼重置

      echo "newpassword" | passwd --stdin root

    • 編輯好的郵件內容與標題一起“打包”,一條命令實現郵件傳送

      echo "Content" | mail -s "Subject" emailaddress

    • 讓使用者一直輸入內容,直到使用者輸入了其自定義的分界符時才結束輸入

      mail -s "Readme" [email protected] << over

  4. 管道符可以在多個命令組合中使用,比如:命令A | 命令B | 命令C

3.3 命令列萬用字元

  1. 星號(*)代表匹配零個或多個字元
  2. 問號(?)代表匹配單個字元
  3. 中括號內加上數字[0-9] 代表匹配0~9之間的單個數字字元
  4. [abc] 代表匹配a、b、c三個字元中任意一個字元

常用轉義字元

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

說明:$$作用為顯示當前程式的程序ID號碼,所以需要使用\對第一個$符號進行轉義

3.5 重要的環境變數

  1. 基本概念

    • 變數是計算機系統用於儲存可變值的資料型別
    • 在Linux系統中變數名稱一般都是大寫
    • 可以直接通過變數名稱來提取到對應的變數值
    • Linux系統中環境變數是用來定義系統執行環境的一些引數,比如每個使用者不同的家目錄、郵件存放地址等
  2. Linux系統執行命令的4個步驟

    在Linux系統中一切都是檔案,命令也不例外

    • 第一步:判斷使用者是否以絕對路徑或相對路徑的方式輸入命令,如果是的話直接執行

    • 第二步:Linux系統檢查使用者輸入命令是否為“別名命令”,即用一個自定義的命令名稱來替換原來的命令名稱。

      可以使用 alias 命令建立一個屬於自己的別名命令,格式為:" alias 別名=命令 "

      如果要取消一個別名命令,使用 unalias 命令,格式為:" unalias 別名 "

      舉例說明:rm 命令刪除檔案會要求我們再確認是否執行刪除操作,其實這就是Linux系統為了防止使用者誤刪檔案而特意設定的rm別名命令。

      操作說明:首先給 rm -i 命令起一個別名為 rm,之後使用rm命令就會提示是否刪除,需要輸入y才能確認刪除。然後我們再刪除rm別名,之後再刪除檔案就不會再提示是否刪除了。

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

    • 第四步:系統在多個路徑中查詢使用者輸入的命令檔案,定義的這些路徑的變數就叫做PATH ,作用是告訴Bash直譯器待執行的命令可能存放的位置,然後Bash直譯器會從這些位置中逐個查詢。

      PATH是由多個路徑值組成的變數,每個路徑之間使用冒號間隔。

      為什麼不能將當前目錄(.)新增到PATH中?

      原因是儘管可以新增,從而在某些情況下可以讓使用者免去輸出命令所在路徑的麻煩。但如果黑客在比較常用的公共目錄/tmp中存放了一個與ls或cd命令同名的木馬檔案,而使用者恰巧在公共目錄執行這些命令,就極有可能中招。

  3. Liunx中最最重要的10個環境變數

變數名稱 作用
HOME 使用者的主(家)目錄
SHELL 使用者在使用的Shell直譯器名稱
HISTSIZE 輸出的歷史命令記錄條數
HISTFILESIZE 儲存的歷史命令記錄條數
MAIL 郵件儲存路徑
LANG 系統語言、語系名稱
RANDOM 生成一個隨機數字
PS1 Bash直譯器的提示符
PATH 定義直譯器搜尋使用者執行命令的路徑
EDITOR 使用者預設的文字編輯器

拓展:

  • Liunx作為一個多使用者多工作業系統,為每個使用者提供獨立的、合適的工作執行環境,因此,一個相同的變數會因為使用者身份的不同而具有不同的值。
  • su 用於切換使用者身份
  • 變數由固定的變數名與使用者或系統設定的變數值兩部分組成,可以自行建立變數來滿足工作需求。
  • 自行建立的變數不具有全域性性,作用範圍也有限,預設情況下不能被其他使用者使用。可以使用 export 命令將其提升為全域性變數。