哪怕我們配不上自己的野心,也不要辜負了現在所受的苦難。
Linux shell 是個交互式工具,使用戶可以啟動程序、管理文件以及管理Linux系統上的進程。shell的核心是命令行提示符,是shell的交互部分,它允許你輸入文本命令,之后解釋命令并在內核中執行。
shell包含了一組內置命令,可以用來完成一系列的操作,比如復制文件、移動文件、重命名文件以及顯示和終止系統上正在運行的程序。
shell命令也可以寫入文件中作為程序來執行,這些文件被稱作shell腳本。
1.啟動shell
大多數Linux發行版的默認shell都是GNU bash shell,它是作為常規程序運行的,通常是在用戶登錄終端時啟動,登錄時系統啟動的shell取決于用戶賬戶的配置。
/etc/passwd 文件中包含了所有用戶列表以及每個用戶的基本配置信息。
2.shell提示符
默認的shell提示符是美元符號$,這個符號表明shell在等待用戶輸入。
3.Linux文件系統
首先我們先了解一下Linux的文件系統的構建方式,這和Windows有很大區別。
Windows為每個物理磁盤驅動器分配一個盤符,每個驅動器都會有自己的目錄結構,以便訪問存儲在其上的文件。區別于Windows,Linux在路徑名中不使用驅動器盤符,Linux將文件存儲在單個目錄結構中,這個目錄我們稱之為 虛擬目錄。
虛擬目錄結構包含一個稱為根(root)目錄的基礎目錄,根目錄下的目錄和文件會按照訪問它們的目錄路徑一一列出,這點和Windows類似。
舉個例子,Linux文件路徑/home/valie/Document/read.txt,表明read.txt位于Document目錄,Document又位于valie目錄,valie則在home目錄中,但并沒有說明home目錄存在于哪個物理磁盤中。
Linux的根驅動器一般用來存儲系統文件,而用戶文件通常存儲在另一個驅動器里,上面所舉例的home目錄就是位于這個驅動啟器中,那么在沒有給出驅動器盤符的情況下,系統又是如何訪問到home目錄的呢?
這里就要提到 ‘掛載點 ’的概念,那么什么是掛載點?
Linux會在根驅動器中創建一些特別的目錄,這些目錄稱之為‘掛載點’,但事實上這些目錄并不是存儲在根驅動器上,而是存儲在另一個驅動器上。
- / : 虛擬目錄的根目錄,通常不會在這里存儲文件
- /usr :用戶安裝軟件的目錄
- /var :可變目錄,用以存放經常變化的文件,比如日志文件
- /bin :二進制目錄,存放許多GNU用戶級的工具
- /dev :設備目錄,Linux在這里創建設備節點
- /home :主目錄,Linux在這里創建用戶目錄
- /etc :系統配置文件目錄
- /boot :啟動目錄,存放啟動文件
- /opt :可選目錄,通常用于存放可選的軟件包
- /lib :庫目錄,存放系統和應用程序的庫文件
- /tmp :臨時目錄,可以在該目錄創建和刪除臨時工作文件
在啟動一個新的shell提示符后,會話通常是從用戶的主目錄開始。
4.切換目錄
cd + 絕對路徑
cd .. //切換到當前目錄的父目錄
5.文件和目錄列表
-
ls
顯示當前目錄下的文件和目錄 -
ls -F
添加-F參數用于區分目錄和文件,它會在目錄名后添加正斜線/,另外會在可執行文件后加星號* -
ls -a
顯示當前目錄下的全部文件,包括隱藏文件(以點.開頭,通常用來保存配置信息) -
ls -R
列出當前目錄下的所有文件和目錄,包括子目錄下的文件和目錄 -
ls -l
參數-l會以長列表的格式輸出,每一行都列出了單個文件或目錄的更多信息。
6.ls命令的兩種命令行參數
- 單字母參數:以英文破折號開始
- 全字母參數:以雙英文破折號開始
大部分參數都有單字母和雙字母兩種版本,而有的則只有一種,部分列舉如下:
單字母 | 全字母 | 含義 |
---|---|---|
-a | --all | 輸出包括以.開頭的隱藏文件 |
-F | --classify | 給條目追加文件類型標識符 |
-R | --recursive | 遞歸地列出子目錄內容 |
-i | --inode | 顯示每個文件的索引節點 |
-h | --human-readable | 輸出文件或目錄的大小,以字節為單位 |
-s | --size | 輸出每個文件的塊大小 |
-l | 按長列表格式輸出 | |
--author | 輸出每個文件的作者 |
另外,也可以一次使用多個參數。多個雙破折線參數必須分開輸入,而多個單破折線可以組合成一個字符串,如用-s參數列出文件的塊大小,用-a參數列出所有文件,用-i參數列出每個文件的索引點,用-l參數產生一個長列表,組合起來就是:
ls -sail
7.過濾輸出列表
ls + 文件名
:當使用文件名作為過濾器時,ls命令只顯示這個文件的信息;
有時候我們并不確定文件的確切名稱,或者文件的類型,這時候可以使用標準通配符來輸出滿足要求的文件:
- 問號?代表一個字符
- 星號*代表零個或多個字符
比如我想查找Applet文件,但是并不確定它的文件類型,這時候可以這樣使用過濾方法:
ls Applet*
8.創建文件
有時,在寫入數據之前我們希望這個文件就已經存在,這時可以用touch命令來創建空文件。
touch + 文件名
,例如:
9.復制文件
- cp命令用于將文件或目錄復制到另一個位置,最基本的用法就是cp+源文件名+目標文件名,例如:
從上圖可以看出,time.txt是一個全新的文件,有自己的索引節點。
另外,也可以采用絕對路徑來復制文件:
- 在cp命令中使用命令行參數,以下是部分參數
參數 | 含義 |
---|---|
-a | 歸檔文件,并保留原有的屬性 |
-b | 創建已存在的目標文件的備份,而非覆蓋它 |
-f | 強制覆蓋已存在的目標文件,不提示 |
-p | 保留文件屬性,如訪問時間、修改時間等 |
-r | 遞歸地復制文件 |
-R | 遞歸地復制目錄 |
從上圖可以看出對于已經存在的time1.txt文件,強行復制之后擁有和源文件time.txt一樣的修改時間。
10.使用ln命令創建鏈接文件
有時,我們需要在系統上維護同一份文件的一到多個副本,用上面個的cp命令復制多個副本并同時維護的方式雖然可行,但很費時費力。這時我們可以用創建虛擬副本的方法來完使維護工作變得輕松起來,這個虛擬副本就稱為鏈接。鏈接是目錄中指向文件真實位置的占位符。
Linux下的兩種不同類型的文件鏈接:
- 硬鏈接,創建方式:
ln + 源文件名 + 目標文件名
- 軟連接,即符號鏈接,創建方式:
ln -s + 源文件名 + 目標文件名
硬鏈接與軟鏈接的區別在于,硬鏈接只能在同種存儲媒體上的文件之間創建,不能在不同掛載點下的文件間創建,也就是說不在同一個磁盤分區中文件之間不能創建硬鏈接,而是使用軟鏈接。
從上圖可以看出,time1.txt和time.txt文件的索引節點號是相同的,表明實際上它們是同一個文件,并且在我修改了time.txt文件后(time.txt中添加了一行‘This is the first modification.’),time1.txt文件中的內容也同步改變了。
從上圖看到,文件time2.txt的索引節點號與time.txt不同,說明time2.txt是一個單獨的文件,并且文件變小了,是因為它只需要存儲源文件的信息,并不需要存儲文件中的數據。
10.重命名/移動文件或目錄
在Linux中,文件和目錄的重命名和移動使用的是mv命令(moving),例如:
需要注意的是,移動一個有軟鏈接指向的文件會使得它的軟鏈接失效,如下圖time1.txt是一個指向time.txt的硬鏈接,time2.txt是一個指向time.txt的軟鏈接,當time.txt重命名為time3.txt后,time2.txt軟鏈接已不再是一個有效鏈接,已經無法訪問到它所指向的源文件中的內容:
另外mv命令也用于將文件移動到別的目錄中,如下:
11.刪除文件
刪除文件的操作命令是rm,常用參數如下:
參數 | 含義 |
---|---|
-i | interactive,即刪除前詢問是否確認刪除 |
-f | force ,即無視提示符,強制刪除 |
-r | recursive,刪除目錄,在刪除這一目錄前會事先刪除目錄中的內容 |
同樣需要注意的是,當刪除一個帶有軟鏈接的文件時,它的軟鏈接會失效,硬鏈接保持有效。這是因為硬鏈接文件具有和源文件相同的索引節點號,硬鏈接會維持這個索引節點號來保留數據,直到你刪除了最后一個指向這個索引節點的硬鏈接。這一點類似于OC中的引用計數。軟鏈接存放的是源文件的路徑,當源文件已經不存在時,軟鏈接中所指向的源文件路徑也就不可用了,所以軟鏈接失效。
12.創建目錄
創建目錄不能使用touch命令,而是使用mkdir命令,如:
mkdir dir
13.刪除目錄
· 刪除目錄的基本命令是rmdir, 但是rmdir只能刪除空目錄,當目錄下有文件時,這個目錄就不能被刪除:
要想刪除一個非空目錄,我們得用到rm命令,rm -r + 目錄名稱
會遞歸地刪除目錄中的文件,最后再刪除目錄本身:
14.查看文件信息
stat + 文件名
可以查看文件的所有狀態信息
file + 文件名
查看文件類型
file命令將文件分為3類:
- 文本文件:包含可打印字符的文件
- 可執行文件:可在系統上運行的文件
- 數據文件:包含不可打印的二進制字符,又不能在系統上運行的文件
15.查看文件內容
- 使用cat命令查看文件所有數據內容,cat命令常用的參數如下:
參數 | 含義 |
---|---|
-n | 給所有行添加行號 |
-b | 只給有文本的行添加行號 |
-s | 將多個空白行壓縮成單個空白行 |
-e | 在每行結束處添加美元符$ |
-t | 用^+豎線去替代文中的制表符(ps:簡書寫作格式bug) |
使用cat命令會打印出文件的全部內容,但是如果文件內容非常多,那么查看文件內容非常不便,這時可以使用more命令。
- 使用more命令查看文件內容 -- 實現分頁查看
more命令常用的參數列舉:
參數 | 含義 |
---|---|
+n | 從第n行開始顯示 |
-n | 設置每屏大小為n行 |
-s | 將多個空白行壓縮成單個空白行 |
使用的常用操作符有:
操作命令 | 含義 |
---|---|
Enter | 向下n行,默認為1行,需要設置 |
cmd + F | 向下滾動一屏 |
空格鍵 | 向下滾動一屏 |
cmd + B | 返回上一屏 |
= | 輸出當前行的行號 |
V | 調出vi編輯器 |
Q | 退出more命令 |
- 使用head命令查看文件的開頭內容,默認顯示10行
- 使用tail命令查看文件的尾部內容,默認顯示10行