Linux基礎(管道符、重定向、轉義字符與環境變量)

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生成一個隨機數字
PS1Bash解釋器的提示符
PATH定義解釋器搜索用戶執行命令的路徑
EDITOR用戶默認的文本編輯器

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534332.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件工程(數據流圖例題詳解)

假設一家工廠的采購部每天需要一張訂貨報表&#xff0c;報表按零件編號排序&#xff0c;表中列出所有需要再次訂貨的零件。對于每個需要再次訂貨的零件應該列出下述的數據&#xff1a;零件編號&#xff0c;零件名稱&#xff0c;訂貨數量&#xff0c;目前價格&#xff0c;主要供…

軟件工程(數據流圖的命名、用途和自動化邊界)

數據流圖中每個成分的命名是否恰當&#xff0c;直接影響數據流圖的可理解性。因此&#xff0c;給這些成分起名字時應該仔細推敲。 命名 1.為數據流(或數據存儲)命名 (1)名字應代表整個數據流(或數據存儲)的內容&#xff0c;而不是僅僅反映它的某些成分。 (2)不要使用空洞的…

軟件工程(數據字典)

數據字典 數據字典是關于數據的信息的集合&#xff0c;也就是對數據流圖中包含的所有元素的定義的集合。 任何字典最主要的用這都是供人查閱對不了解的條目的解釋&#xff0c;數據字典的作用也正是在軟件分析和設計的過程中給人提供關于數據的描述信息。 數據流圖和數據字典共…

Qt圖形界面編程入門(Qt的歷史、Qt安裝資源鏈接、Qt Creator簡介)

Qt的歷史淵源 Qt是1991年由挪威的奇趣科技(Trolltech)公司開發的跨平臺C圖形用戶界面(GUI)用程序開發框架&#xff0c;2008年&#xff0c;奇趣科技公司被諾基亞公可收購&#xff0c;Qt也因此成為諾基亞公司旗下的編程語言工具&#xff0c;曾稱霸一時的Symbian手機操作系統就是…

Qt圖形界面編程入門(創建一個簡單的程序)

1&#xff0c;手工編碼方式 利用手工編碼方式建立“Hello Qt&#xff01;”程序 第一步&#xff1a; 得到界面 2&#xff0c;無UI的向導方式 從圖中&#xff0c;我們發現向導為窗口程序提供了3個基類&#xff0c;分別外QMainWindow、QWidget、QDialog&#xff0c;3個基類的區…

Linux基礎(Vim編輯器與Shell命令腳本)

1、Vim文本編輯器 Vim文本編輯器有三種模式 命令模型&#xff1a;控制光標移動&#xff0c;可對文本進行復制、粘貼、刪除和查找得等工作。 輸入模式&#xff1a;正常的文本錄入 末行模式&#xff1a;保存或退出文檔&#xff0c;以及設置編輯環境。 在每次運行Vim編輯器時&…

Python二級筆記(16)

知識點&#xff1a; 1&#xff0c;進程調度僅負責對CPU進行分配 2&#xff0c;帶鏈的隊列是采用鏈式存儲結構表示的隊列。鏈式存儲的存儲單元是不連續的&#xff0c;因為是不連續的存儲空間&#xff0c;所以指針將不會有規律的地連續變化。當front rear NULL時&#xff0c;…

Python二級筆記(17)

操作題&#xff1a; 1&#xff0c;接收用戶輸入的一個浮點數&#xff0c;輸出這個浮點數的小數部分各字符的和&#xff0c;以10為寬度,靠右顯示&#xff0c;,采用星號*填充。 代碼&#xff1a; s input("請輸入一個小數&#xff1a;") s s[::1] cs () for c in…

Python二級筆記(18,19合集操作篇)

操作題&#xff1a; 1&#xff0c;鍵盤輸入正整數n,按要求把n輸出到屏幕&#xff0c;格式要求&#xff1a;寬度為25個字符&#xff0c;等號字符&#xff08;&#xff09;填充&#xff0c;右對齊&#xff0c;帶千位分隔符。如果輸入正整數超過25位&#xff0c;則按照真實長度輸…

Qt圖形界面編程入門(信號和槽通信機制)

信號和槽機制是Qt的核心機制&#xff0c;可以讓編程人員將互不相關的對象綁定在一起&#xff0c;實現對象之間的通信。 聲明了信號的對象&#xff0c;當其狀態改變時&#xff0c;信號就由該對象發送出去&#xff0c;而且該對象只負責發送信號&#xff0c;它不知道另一端是誰在…

Python二級筆記(18,19合集知識點篇)

知識點&#xff1a; 1&#xff0c;軟件測試的目的是發現程序中的錯誤。調試是作為成功測試的后過而出現的步驟&#xff0c;也就是&#xff0c;調試是在測試發現錯誤之后排除錯誤的過程。軟件調試的任務是診斷和改成程序中的錯誤。 2&#xff0c;深度等于控制的層數 3&#x…

軟件工程(成本/效益分析)

一般說來&#xff0c;人們投資于一項事業的目的是為了在將來得到更大的好處。開發一個軟件系統也是一種投資&#xff0c;期望將來獲得更大的經濟效益&#xff0c;經濟效益通常表現為減少運行費用或增加收入。但是&#xff0c;投資開發新系統往往需要冒一定的風險。系統的開發成…

Linux基礎(用戶身份和文件權限)

用戶身份與能力 Linux是一個多用戶、多任務的操作系統&#xff0c;具有很好的穩定性與安全性&#xff0c;在幕后保障Linux系統安全則是一系列復雜的配置工作。 Linux系統的管理員之所以是root&#xff0c;并不是因為它的名字叫root&#xff0c;而是因為該用戶的身份號碼即UID…

Centos 8 RHEL 8 破解root密碼

https://blog.csdn.net/u014042047/article/details/107309890/

TensorFlow實驗(1)

實驗1-2 搭建深度學習開發環境 1&#xff09;安裝Anaconda 2&#xff09;創建虛擬環境&#xff1a; 3&#xff09;激活環境 4&#xff09;安裝tensorflow 5)安裝jupyter notebook 安裝完成之后&#xff0c;運行第一個程序“Hello,World” 要求&#xff1a;詳細安裝步驟&…

TensorFlow實驗(2)

實驗3-4 數據結構-張量 1&#xff09;已知兩個張量[1,3,5,7]和[2,4,4,8],編寫一個模型&#xff0c;計算兩個張量的加法&#xff0c;輸出結果&#xff0c;并在tensorboard中顯示 2&#xff09;已知張量[1,2,3,4,5,6,7,8,9,10,11,12]有12個元素&#xff0c;利用tf.reshape()將其…

Linux基礎(文件權限續篇)

文件的特殊權限 在復雜多變的生產環境中&#xff0c;單純設置文件的rwx權限無法滿足我們對安全和靈活性的需求&#xff0c;因此便有了SUID,SGID,SBIT的特殊權限位。這是一種對文件權限進行設置的特殊功能&#xff0c;可以與一般權限同時使用&#xff0c;以彌補一般權限不能實現…

Linux基礎(存儲結構和磁盤劃分)

一切從“/”開始 在Linux系統中&#xff0c;目錄、字符設備、塊設備、套接字、打印機等都被抽象成了文件&#xff0c;一切皆為件 與windows操作系統不同&#xff0c;Linux系統內不存在C/D/E/F盤等&#xff0c;一切文件都是從根&#xff08;/&#xff09;目錄開始的 Linux系統…

軟件工程(需求分析)

需求分析 為了開發出真正滿足用戶需求的軟件產品&#xff0c;首先必須知道用戶的需求。對軟件需求的深人理解是軟件開發工作獲得成功的前提條件&#xff0c;不論人們把設計和編碼工作做得如何出色,不能真正滿足用戶需求的程序只會令用戶失望.給開發者帶來煩惱。 需求分析是軟…

TensorFlow構建二維數據擬合模型(1)

知識圖譜 TensorFlow運行機制 TensorFlow是基于計算圖的深度學習編程模型 Tensor表示張量&#xff0c;其實質上是某種類型的多維數組 Flow表示基于數據流圖的計算&#xff0c;實質上是張量在不同節點間的轉化過程。 在TensorFlow中&#xff0c;計算圖中的節點稱為OP&…