1. 程式人生 > >學習《Linux命令列與shell指令碼程式設計大全》

學習《Linux命令列與shell指令碼程式設計大全》

  • 【馬哥私房菜】親情推出《linux shell指令碼攻略》視訊教程

  • 【馬哥私房菜】親情推出 git 視訊教程

《Linux命令列與shell指令碼程式設計大全》第三版 學習筆記

第1部分 Part 1 Linux 命令列

第1 章 初識Linux shell

本章內容
- 什麼是Linux
- Linux核心的組成
- 探索Linux桌面
- 瞭解Linux發行版

什麼是Linux

Linux可劃分為以下四部分:

  • Linux核心
  • GNU工具
  • 圖形化桌面環境
  • 應用軟體

Linux系統的核心是核心。核心控制著計算機系統上的所有硬體和軟體,在必要時分配硬體,
並根據需要執行軟體。
核心主要負責以下四種功能:
* 系統記憶體管理
* 軟體程式管理 也就是cpu和程序管理
* 硬體裝置管理
* 檔案系統管理

核心管理實體記憶體,還可以建立和管理虛擬記憶體。核心通過硬碟上的儲存空間來實現虛擬記憶體,這塊區域稱為交換空間(swap space) 馬哥私房菜 淘寶https://shop592330910.taobao.com/

ext                Linux擴充套件檔案系統,最早的Linux檔案系統  
ext2               第二擴充套件檔案系統,在ext的基礎上提供了更多的功能  
ext3               第三擴充套件檔案系統,支援日誌功能  
ext4               第四擴充套件檔案系統,支援高階日誌功能  
hpfs               OS/2
高效能檔案系統 jfs IBM日誌檔案系統 iso9660 ISO 9660檔案系統(CD-ROM) minix MINIX檔案系統 msdos 微軟的FAT16 ncp Netware檔案系統 nfs 網路檔案系統 ntfs 支援Microsoft NT檔案系統 proc 訪問系統資訊 ReiserFS 高階Linux檔案系統,能提供更好的效能和硬碟恢復功能 smb 支援網路訪問的Samba SMB檔案系統 sysv 較早期的Unix檔案系統 ufs BSD檔案系統 umsdos 建立在msdos上的類Unix檔案系統 vfat Windows 95
檔案系統(FAT32) XFS 高效能64位日誌檔案系統

GNU/Linux shell是一種特殊的互動式工具。它為使用者提供了啟動程式、管理檔案系統中的文
件以及執行在Linux系統上的程序的途徑。shell的核心是命令列提示符。命令列提示符是shell負責
互動的部分。它允許你輸入文字命令,然後解釋命令,並在核心中執行。

預設shell是bash shell。(建立者bourne),稱為bourne again shell。
除了bash shell 還有其他的shell 馬哥私房菜 淘寶https://shop592330910.taobao.com/

ash 一種執行在記憶體受限環境中簡單的輕量級shell,但與bash shell完全相容  
korn 一種與Bourne shell相容的程式設計shell,但支援如關聯陣列和浮點運算等一些高階的程式設計特性  
tcsh 一種將C語言中的一些元素引入到shell指令碼中的shell  
zsh 一種結合了bash、tcsh和korn的特性,同時提供高階程式設計特性、共享歷史檔案和主題化提示符的高階shell  

linux的桌面環境: X Window系統

KDE(K Desktop EnvironmentK桌面環境)  
GNOME桌面  
Unity桌面  是Ubuntu Linux發行版
Xfce      和KDE很像的一個桌面,但少了很多影象以適應低記憶體環境  

Linux 發行版

Slackware 最早的Linux發行版中的一員,在Linux極客中比較流行  
Red Hat 主要用於Internet伺服器的商業發行版  
Fedora 從Red Hat分離出的家用發行版  
Gentoo 為高階Linux使用者設計的發行版,僅包含Linux原始碼  
openSUSE 用於商用和家用的發行版  
Debian 在Linux專家和商用Linux產品中流行的發行版  
CentOS 一款基於Red Hat企業版Linux原始碼構建的免費發行版  
Ubuntu 一款用於學校和家庭的免費發行版  
PCLinuxOS 一款用於家庭和辦公的免費發行版  
Mint 一款用於家庭娛樂的免費發行版   
dyne:bolic 一款用於音訊和MIDI應用的免費發行版   
Puppy Linux 一款適用於老舊PC的小型免費發行版馬哥私房菜 淘寶https://shop592330910.taobao.com/  

第2 章 走進shell

本章內容
* 訪問命令列
* 通過Linux控制檯終端訪問CLI
* 通過圖形化終端模擬器訪問CLI
* 使用GNOME終端模擬器
* 使用Konsole終端模擬器
* 使用xterm終端模擬器

控制檯終端

在圖形化桌面出現之前,與Unix系統進行互動的唯一方式就是藉助由shell所提供的文字命令
行介面(command line interface,CLI)。CLI只能接受文字輸入,也只能顯示出文字和基本的圖形
輸出。

按下Ctrl+Alt組合鍵,然後按功能鍵(F1~F7)進入要使用的虛擬控制檯
tty代表電傳打字機(teletypewriter)。這是一個古老的名詞,指的是一臺用於傳送訊息的機器。

圖形化終端

圖形化終端,除了虛擬化終端控制檯,還可以使用Linux圖形化桌面環境中的終端模擬包。
常見的影象模擬終端:

GNOME Terminal
GNOME Terminal是GNOME桌面環境的預設終端模擬器。Ubuntu Unity,也採用。
常見的快捷鍵。 馬哥私房菜 淘寶https://shop592330910.taobao.com/

通過Linux 控制檯終端訪問CLI

通過圖形化終端模擬訪問CLI

使用GNOME Terminal 模擬器

GNOME Terminal是GNOME桌面環境的預設終端模擬器。很多發行版,如RHEL、Fedora和
CentOS,預設採用的都是GNOME桌面環境,因此GNOME Terminal自然也就是預設配備了。不
過其他一些桌面環境,比如Ubuntu Unity,也採用GNOME Terminal作為預設的終端模擬軟體包。
它使用起來非常簡單,是Linux新手的不錯選擇.馬哥私房菜 淘寶https://shop592330910.taobao.com/

使用Konsole Terminal 模擬器

Konsole Terminal是KDE桌面環境的預設終端模擬器

使用xterm 終端模擬器

最古老也是最基礎的終端模擬軟體包是xterm。xterm軟體包在X Window出現之前就有了,通常預設包含在發行版中。

第3 章 基本的bash shell 命令

本章內容
* 使用shell
* bash手冊
* 瀏覽檔案系統
* 檔案和目錄列表
* 管理檔案和目錄
* 檢視檔案內容

啟動shell

shell 提示符

在Ubuntu Linux系統上,shell提示符看起來是這樣的:

[email protected]:~$

在CentOS系統上是這樣的:

[[email protected] ~]$

bash 手冊 man命令用來訪問儲存在Linux系統上的手冊頁面

Name              顯示命令名和一段簡短的描述    馬哥私房菜 淘寶https://shop592330910.taobao.com/
Synopsis          命令的語法        
Confi guration    命令配置資訊  
Description       命令的一般性描述  
Options           命令選項描述  
Exit Status       命令的退出狀態指示  
Return Value      命令的返回值  
Errors            命令的錯誤訊息  
Environment       描述所使用的環境變數  
Files             命令用到的檔案  
Versions          命令的版本資訊  
Conforming To     命名所遵從的標準  
Notes             其他有幫助的資料  
Bugs              提供提交bug的途徑  
Example           展示命令的用法  
Authors           命令開發人員的資訊  
Copyright         命令原始碼的版權狀況  
See Also          與該命令型別的其他命令  馬哥私房菜 淘寶https://shop592330910.taobao.com/

如果不記得命令名怎麼辦?可以使用關鍵字搜尋手冊頁。語法是:man -k 關鍵字。例如,要查詢與終端相關的命令,可以輸入man -k terminal。

除了對節按照慣例進行命名,手冊頁還有對應的內容區域。每個內容區域都分配了一個數字,從1開始,一直到9。

1 可執行程式或shell命令      馬哥私房菜 淘寶https://shop592330910.taobao.com/
2 系統呼叫  
3 庫呼叫  
4 特殊檔案  
5 檔案格式與約定  
6 遊戲  
7 概覽、約定及雜項  
8 超級使用者和系統管理員命令  
9 核心例程               馬哥私房菜 淘寶https://shop592330910.taobao.com/

Linux 檔案系統

s
你將會發現Linux使用正斜線(/)而不是反斜線(\)在檔案路徑中劃分目錄。在Linux中,反斜線用來標識轉義字元,要是用在檔案路徑中的話會導致各種各樣的問題

掛載點(mount point)

/ 虛擬目錄的根目錄。通常不會在這裡儲存檔案  
/bin 二進位制目錄,存放許多使用者級的GNU工具  
/boot 啟動目錄,存放啟動檔案  
/dev 裝置目錄,Linux在這裡建立裝置節點  
/etc 系統配置檔案目錄  
/home 主目錄,Linux在這裡建立使用者目錄  
/lib 庫目錄,存放系統和應用程式的庫檔案  
/media 媒體目錄,可移動媒體裝置的常用掛載點  
/mnt 掛載目錄,另一個可移動媒體裝置的常用掛載點  
/opt 可選目錄,常用於存放第三方軟體包和資料檔案  
/proc 程序目錄,存放現有硬體及當前程序的相關資訊  
/root root使用者的主目錄  
/sbin 系統二進位制目錄,存放許多GNU管理員級工具  
/run 執行目錄,存放系統運作時的執行時資料  
/srv 服務目錄,存放本地服務的相關檔案  
/sys 系統目錄,存放系統硬體資訊的相關檔案  
/tmp 臨時目錄,可以在該目錄中建立和刪除臨時工作檔案  
/usr 使用者二進位制目錄,大量使用者級的GNU工具和資料檔案都儲存在這裡  
/var 可變目錄,用以存放經常變化的檔案,比如日誌檔案      馬哥私房菜 淘寶https://shop592330910.taobao.com/

常見的目錄名均基於檔案系統層級標準(filesystem hierarchy standard,FHS)。很多Linux發行版都遵循了FHS。

遍歷目錄

cd命令

絕對檔案路徑。絕對檔案路徑定義了在虛擬目錄結構中該目錄的確切位置,以虛擬目錄的根目錄開始,相當於目錄的全名。

相對檔案路徑。相對檔案路徑允許使用者指定一個基於當前位置的目標檔案路徑。相對檔案路徑不以代表根目
錄的正斜線(/)開頭,而是以目錄名(如果使用者準備切換到當前工作目錄下的一個目錄)或是一個特殊字元開始。

單點符(.),表示當前目錄
雙點符(..),表示當前目錄的父目錄

基本列表功能

ls命令
-l引數會產生長列表格式的輸出
-F引數在目錄名後加了正斜線(/)
-a 以點號開頭的隱藏檔案現在都顯示出來
-R 了當前目錄下包含的子目錄中的檔案
選項並一定要像例子中那樣分開輸入:ls –F –R。它們可以進行如下合併:ls –FR。

顯示長列表

  檔案型別,比如目錄(d)、檔案(-)、字元型檔案(c)或塊裝置(b)  
  檔案的許可權(參見第6章)  
  檔案的硬連結總數  
  檔案屬主的使用者名稱  
  檔案屬組的組名  
  檔案的大小(以位元組為單位)  
  檔案的上次修改時間  
  檔名或目錄名           馬哥私房菜 淘寶https://shop592330910.taobao.com/

過濾輸出列表

問號(?)代表一個字元。
星號(*)代表零個或多個字元。

在過濾器中使用星號和問號被稱為檔案擴充套件匹配(file globbing),指的是使用萬用字元進行模
式匹配的過程。萬用字元正式的名稱叫作元字元萬用字元(metacharacter wildcards)

ls -l my_script

ls -l my_scr?pt

ls -l my*

ls -l my_s*t

ls -l my_scr[ai]pt   # 可能出現的2中字元,a,i。

ls -l f[a-i]ll    # 表示範圍內的

ls -l f[!a]ll     #感嘆號(!)將不需要的內容排除在外 馬哥私房菜 淘寶https://shop592330910.taobao.com/

建立檔案

touch命令
建立了你指定的新檔案,並將你的使用者名稱作為檔案的屬主。注意,檔案的大小是零,因為touch命令只建立了一個空檔案

複製檔案

cp命令

cp source destination

-r或-R 選項表明遞迴操作
-l 建立檔案的硬連結而不是複製這個檔案
-s 建立檔案的符號連結而不是複製這個檔案
-L 跟隨符號連線檔案
-P 不跟隨符號連線檔案

製表鍵自動補全

連結檔案

符號連結 符號連結就是一個實實在在的檔案,它指向存放在虛擬目錄結構中某個地方的另一個檔案.

ln -s

硬連結
硬連結會建立獨立的虛擬檔案,其中包含了原始檔案的資訊及位置。但是它們從根本上而言
是同一個檔案。引用硬連結檔案等同於引用了原始檔。要建立硬連結,原始檔案也必須事先存在.

重新命名檔案

mv命令
注意,移動檔案會將檔名從fall更改為fzll,但inode編號和時間戳保持不變。這是因為mv隻影響檔名。

刪除檔案

rm命令
在Linux中,刪除(deleting)叫作移除(removing)

建立目錄

mkdir命令


mkdir New_Dir                       # 馬哥私房菜 淘寶https://shop592330910.taobao.com/

mkdir -p New_Dir/Sub_Dir/Under_Dir  # 要想同時建立多個目錄和子目錄,需要加入-p引數:

刪除目錄

rmdir 命令

rmdir只能刪除空目錄

檢視檔案型別

file命令
決定檔案是什麼型別

檢視整個檔案

cat命令
顯示文字檔案中所有資料
-n引數會給所有的行加上行號
-b引數 如果只想給有文字的行加上行號
-T引數會用^I字元組合去替換文中的所有制表符

more命令
cat命令的主要缺陷是:一旦執行,你就無法控制後面的操作.
more命令會顯示文字檔案的內容,但會在顯示每頁資料之後停下來,more命令是分頁工具。
按空格鍵或回車鍵以逐行向前的方式瀏覽文字檔案。按q鍵退出。

* 空格代表向下翻頁  
* 回車帶哦不下翻一行
* /字串  代表在這個顯示的內容中向下搜尋字串
*  :f 立即顯示出檔案明以及當前行數。
*  q退出,離開
*  b或者ctrl + b  代表往前翻頁,只對檔案有效。對管道無用

less命令
less和more類似 。但是比more更強大。支援往前檢視檔案內容 。

* 空格代表向下翻一頁
* pagedown向下翻一頁
* pageup向上翻一頁
* /字串  代表向下搜尋字串
* ?字串  代表向上搜尋字串
* n 代表重複前一個搜尋
* N反向重複前一個搜尋
* g到第一行
* G到最後一行
* q退出,離開

檢視部分檔案

tail命令
tail命令會顯示檔案最後幾行的內容(檔案的“尾部”)。預設情況下,它會顯示檔案的末尾10行。
-f引數允許你在其他程序使用該檔案時檢視檔案的內容。
tail命令會保持活動狀態,並不斷顯示新增到檔案中的內容。這是實時監測系統日誌的絕妙方式。

head命令
預設情況下,它會顯示檔案前10行的文字.head命令沒有-f選項啊,因為檔案開頭是不會改變的。
-n引數,這樣就可以指定輸入想要顯示的行數..

第4 章 更多的bash shell 命令

本章內容
* 管理程序
* 獲取磁碟統計資訊
* 掛載新磁碟
* 排序資料
* 歸檔資料

探查程序

ps命令
當程式執行在系統上時,我們稱之為程序(process)。
預設情況下,ps命令只會顯示執行在當前控制檯下的屬於當前使用者的程序。
程序ID(Process ID,PID)

Linux系統中使用的GNU ps命令支援3種不同型別的命令列引數:

  Unix風格的引數,前面加單破折線;  
  BSD風格的引數,前面不加破折線;  
  GNU風格的長引數,前面加雙破折線。  馬哥私房菜 淘寶https://shop592330910.taobao.com/

Unix風格的ps命令引數:

-A              顯示所有程序  
-N              顯示與指定引數不符的所有程序  
-a              顯示除控制程序(session leader①)和無終端程序外的所有程序  
-d              顯示除控制程序外的所有程序  
-e              顯示所有程序,顯示所有執行在系統上的程序。   
-C              cmdlist 顯示包含在cmdlist列表中的程序  
-G              grplist 顯示組ID在grplist列表中的程序  
-U              userlist 顯示屬主的使用者ID在userlist列表中的程序  
-g              grplist 顯示會話或組ID在grplist列表中的程序②  
-p              pidlist 顯示PID在pidlist列表中的程序  
-s              sesslist 顯示會話ID在sesslist列表中的程序  
-t              ttylist 顯示終端ID在ttylist列表中的程序  
-u              userlist 顯示有效使用者ID在userlist列表中的程序  
-F              顯示更多額外輸出(相對-f引數而言)  
-O              format 顯示預設的輸出列以及format列表指定的特定列  
-M              顯示程序的安全資訊  
-c              顯示程序的額外排程器資訊  
-f              顯示完整格式的輸出,擴充套件了輸出。  
-j              顯示任務資訊  
-l              顯示長列表  
-o              format 僅顯示由format指定的列  
-y              不要顯示程序標記(process flag,表明程序狀態的標記)  
-Z              顯示安全標籤(security context)①資訊  
-H              用層級格式來顯示程序(樹狀,用來顯示父程序)  
-n              namelist 定義了WCHAN列顯示的值  
-w              採用寬輸出模式,不限寬度顯示  
-L              顯示程序中的執行緒  
-V              顯示ps命令的版本號       馬哥私房菜 淘寶https://shop592330910.taobao.com/

-f引數的擴充套件的列包含了有用的資訊。

  UID:         啟動這些程序的使用者。  
  PID:         程序的程序ID。  
  PPID:        父程序的程序號(如果該程序是由另一個程序啟動的)。  
  C:           程序生命週期中的CPU利用率。  
  STIME:       程序啟動時的系統時間。  
  TTY:         程序啟動時的終端裝置。  
  TIME:        執行程序需要的累計CPU時間。  
  CMD:         啟動的程式名稱。  

使用了-l引數之後多出的那些列。

  F:          核心分配給程序的系統標記。  
  S:          程序的狀態(O代表正在執行;S代表在休眠;R代表可執行,正等待執行;Z代表僵  化,程序已結束但父程序已不存在;T代表停止)。  
  PRI:        程序的優先順序(越大的數字代表越低的優先順序)。  
  NI:         謙讓度值用來參與決定優先順序。  
  ADDR:       程序的記憶體地址。  
  SZ:         假如程序被換出,所需交換空間的大致大小。  
  WCHAN:      程序休眠的核心函式的地址。 馬哥私房菜 淘寶https://shop592330910.taobao.com/ 

BSD風格的引數:

T               顯示跟當前終端關聯的所有程序  
a               顯示跟任意終端關聯的所有程序  
g               顯示所有的程序,包括控制程序  
r               僅顯示執行中的程序  
x               顯示所有的程序,甚至包括未分配任何終端的程序
U               userlist 顯示歸userlist列表中某使用者ID所有的程序
p               pidlist 顯示PID在pidlist列表中的程序
t               ttylist 顯示所關聯的終端在ttylist列表中的程序
O               format 除了預設輸出的列之外,還輸出由format指定的列
X               按過去的Linux i386暫存器格式顯示
Z               將安全資訊新增到輸出中
j               顯示任務資訊
l               採用長模式
o               format 僅顯示由format指定的列
s               採用訊號格式顯示
u               採用基於使用者的格式顯示
v               採用虛擬記憶體格式顯示
N               namelist 定義在WCHAN列中使用的值
O               order 定義顯示資訊列的順序
S               將數值資訊從子程序加到父程序上,比如CPU和記憶體的使用情況
c               顯示真實的命令名稱(用以啟動程序的程式名稱)
e               顯示命令使用的環境變數
f               用分層格式來顯示程序,表明哪些程序啟動了哪些程序
h               不顯示頭資訊
k               sort 指定用以將輸出排序的列
n               和WCHAN資訊一起顯示出來,用數值來表示使用者ID和組ID
w               為較寬螢幕顯示寬輸出
H               將執行緒按程序來顯示
m               在程序後顯示執行緒
L               列出所有格式指定符
V               顯示ps命令的版本號       馬哥私房菜 淘寶https://shop592330910.taobao.com/

大部分的輸出列跟使用Unix風格引數時的輸出是一樣的,只有一小部分不同。

  VSZ:        程序在記憶體中的大小,以千位元組(KB)為單位。  
  RSS:        程序在未換出時佔用的實體記憶體。  
  STAT:       代表當前程序狀態的雙字元狀態碼。  

BSD風格的l引數。它能輸出更詳細的程序狀態碼(STAT列)。雙字元狀態碼能比Unix風格輸出的單字元狀態碼更清楚地表示程序的當前狀態。
第一個字符采用了和Unix風格S列相同的值,表明程序是在休眠、執行還是等待。第二個引數進一步說明程序的狀態。

  <:該程序執行在高優先順序上 。  
  N:該程序執行在低優先順序上。  
  L:該程序有頁面鎖定在記憶體中。  
  s:該程序是控制程序。  
  l:該程序是多執行緒的。  
  +:該程序執行在前臺 。   馬哥私房菜 淘寶https://shop592330910.taobao.com/

GNU長引數風格:

--deselect           顯示所有程序,命令列中列出的程序  
--Group grplist      顯示組ID在grplist列表中的程序  
--User userlist      顯示使用者ID在userlist列表中的程序  
--group grplist      顯示有效組ID在grplist列表中的程序  
--pid pidlist        顯示PID在pidlist列表中的程序  
--ppid pidlist       顯示父PID在pidlist列表中的程序  
--sid sidlist        顯示會話ID在sidlist列表中的程序  
--tty ttylist        顯示終端裝置號在ttylist列表中的程序  
--user userlist      顯示有效使用者ID在userlist列表中的程序  
--format format      僅顯示由format指定的列  
--context            顯示額外的安全資訊  
--cols n             將螢幕寬度設定為n列  
--columns n          將螢幕寬度設定為n列  
--cumulative         包含已停止的子程序的資訊  
--forest             用層級結構顯示出程序和父程序之間的關係  
--headers            在每頁輸出中都顯示列的頭  
--no-headers         不顯示列的頭  
--lines n            將螢幕高度設為n行  
--rows n             將螢幕高度設為n排  
--sort order         指定將輸出按哪列排序  
--width n            將螢幕寬度設為n列  
--help               顯示幫助資訊  
--info               顯示除錯資訊  
--version            顯示ps命令的版本號    馬哥私房菜 淘寶https://shop592330910.taobao.com/

–forest引數。它會顯示程序的層級資訊,並用ASCII字元繪出可愛的圖表 。

實時監測程序

top命令
跟ps命令相似,能夠顯示程序資訊,但它是實時顯示的 。
第一行顯示了當前時間、系統的執行時間、登入的使用者數以及系統的平均負載。

平均負載有3個值:最近1分鐘的、最近5分鐘的和最近15分鐘的平均負載。值越大說明系統
的負載越高。由於程序短期的突發性活動,出現最近1分鐘的高負載值也很常見,但如果近15分
鍾內的平均負載都很高,就說明系統可能有問題。

通常,如果系統的負載值超過了2,就說明系統比較繁忙了。馬哥私房菜 淘寶https://shop592330910.taobao.com/

第二行顯示了程序概要資訊——top命令的輸出中將程序叫作任務(task):有多少程序處在執行、休眠、停止或是僵化狀態(僵化狀態是指程序完成了,但父程序沒有響應)。
第仨行顯示了CPU的概要資訊。top根據程序的屬主(使用者還是系統)和程序的狀態(執行、空閒還是等待)將CPU利用率分成幾類輸出。
第四行說的是系統的實體記憶體:總共有多少記憶體,當前用了多少,還有多少空閒。
第五行後一行說的是同樣的資訊,不過是針對系統交換空間(如果分配了的話)的狀態而言的。
最後一部分顯示了當前執行中的程序的詳細列表,有些列跟ps命令的輸出類似。

  PID:         程序的ID。                   馬哥私房菜 淘寶https://shop592330910.taobao.com/
  USER:        程序屬主的名字。
  PR:          程序的優先順序。
  NI:          程序的謙讓度值。
  VIRT:        程序佔用的虛擬記憶體總量。
  RES:         程序佔用的實體記憶體總量。
  SHR:         程序和其他程序共享的記憶體總量。
  S:           程序的狀態(D代表可中斷的休眠狀態,R代表在執行狀態,S代表休眠狀態,T代表跟蹤狀態或停止狀態,Z代表僵化狀態)。
  %CPU:        程序使用的CPU時間比例。
  %MEM:        程序使用的記憶體佔可用記憶體的比例。
  TIME+:       自程序啟動到目前為止的CPU時間總量。
  COMMAND:     程序所對應的命令列名稱,也就是啟動的程式名。 馬哥私房菜 淘寶https://shop592330910.taobao.com/

鍵入f允許你選擇對輸出進行排序的欄位
鍵入d允許你修改輪詢間隔
鍵入q可以退出top

結束程序

在Linux中,程序之間通過訊號來通訊。程序的訊號就是預定義好的一個訊息,程序能識別它並決定忽略還是作出反應。

1       HUP             掛起
2       INT             中斷
3       QUIT            結束執行
9       KILL            無條件終止
11      SEGV            段錯誤
15      TERM            儘可能終止
17      STOP            無條件停止執行,但不終止
18      TSTP            停止或暫停,但繼續在後臺執行
19      CONT            在STOP或TSTP之後恢復執行    馬哥私房菜 淘寶https://shop592330910.taobao.com/

kill命令
kill命令可通過程序ID(PID)給程序發訊號。預設情況下,kill命令會向命令列中列出的
全部PID傳送一個TERM訊號。遺憾的是,你只能用程序的PID而不能用命令名

killall命令
killall命令非常強大,它支援通過程序名而不是PID來結束程序。killall命令也支援萬用字元,這在系統因負載過大而變得很慢時很有用。

# killall http*         # 馬哥私房菜 淘寶https://shop592330910.taobao.com/
#

上例中的命令結束了所有以http開頭的程序,比如Apache Web伺服器的httpd服務。

掛載儲存媒體

mount命令
預設情況下,mount命令會輸出當前系統上掛載的 裝置列表。

$ mount      
/dev/sda2       on      / type ext4 (rw,errors=remount-ro)
proc            on      /proc type proc (rw,noexec,nosuid,nodev)
sysfs           on      /sys type sysfs (rw,noexec,nosuid,nodev)
none            on      /sys/fs/cgroup type tmpfs (rw)
none            on      /sys/fs/fuse/connections type fusectl (rw)
none            on      /sys/kernel/debug type debugfs (rw)
none            on      /sys/kernel/security type securityfs (rw)
udev            on      /dev type devtmpfs (rw,mode=0755)
devpts          on      /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs           on      /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none            on      /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none            on      /run/shm type tmpfs (rw,nosuid,nodev)
none            on      /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none            on      /sys/fs/pstore type pstore (rw)
/dev/sda3       on      /home type ext4 (rw)
/dev/sdb1       on      /home/mamh/share type ext4 (rw)
binfmt_misc     on      /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
rpc_pipefs      on      /run/rpc_pipefs type rpc_pipefs (rw)
systemd         on      /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
gvfsd-fuse      on      /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=mamh)

mount命令提供如下四部分資訊:

  媒體的裝置檔名
  媒體掛載到虛擬目錄的掛載點
  檔案系統型別
  已掛載媒體的訪問狀態      馬哥私房菜 淘寶https://shop592330910.taobao.com/

手動掛載媒體裝置的基本命令

mount -t type device directory

type引數指定了磁碟被格式化的檔案系統型別

手動將U盤/dev/sdb1掛載到/media/disk

mount -t vfat /dev/sdb1 /media/disk

mount命令的引數

-a      掛載/etc/fstab檔案中指定的所有檔案系統      馬哥私房菜 淘寶https://shop592330910.taobao.com/
-f      使mount命令模擬掛載裝置,但並不真的掛載
-F      和-a引數一起使用時,會同時掛載所有檔案系統
-v      詳細模式,將會說明掛載裝置的每一步
-I      不啟用任何/sbin/mount.filesystem下的檔案系統幫助檔案
-l      給ext2、ext3或XFS檔案系統自動新增檔案系統標籤
-n      掛載裝置,但不註冊到/etc/mtab已掛載裝置檔案中
-p      num 進行加密掛載時,從檔案描述符num中獲得密碼短語
-s      忽略該檔案系統不支援的掛載選項
-r      將裝置掛載為只讀的
-w      將裝置掛載為可讀寫的(預設引數)
-L      label 將裝置按指定的label掛載
-U      uuid 將裝置按指定的uuid掛載
-O      和-a引數一起使用,限制命令只作用到特定的一組檔案系統上
-o      給檔案系統新增特定的選項                 馬哥私房菜 淘寶https://shop592330910.taobao.com/

-o引數允許在掛載檔案系統時新增一些以逗號分隔的額外選項。以下為常用的選項。

  ro:以只讀形式掛載。
  rw:以讀寫形式掛載。
  user:允許普通使用者掛載檔案系統。
  check=none:掛載檔案系統時不進行完整性校驗。
  loop:掛載一個檔案。                  馬哥私房菜 淘寶https://shop592330910.taobao.com/

mount命令
從Linux系統上移除一個可移動裝置時,不能直接從系統上移除,而應該先解除安裝。
umount命令的格式非常簡單:umount [directory | device ]
umount命令支援通過裝置檔案或者是掛載點來指定要解除安裝的裝置。如果有任何程式正在使用裝置上的檔案,系統就不會允許你解除安裝它。

使用df 命令

檢視所有已掛載磁碟的使用情況

   裝置的裝置檔案位置;
* 能容納多少個1024位元組大小的塊;
* 已用了多少個1024位元組大小的塊;
* 還有多少個1024位元組大小的塊可用;
* 已用空間所佔的比例;
* 裝置掛載到了哪個掛載點上。

-h。它會把輸出中的磁碟空間按照使用者易讀的形式顯示,通常用M來替代兆位元組,用G替代吉位元組

使用du 命令

顯示某個特定目錄(預設情況下是當前目錄)的磁碟使用情況
-c:顯示所有已列出檔案總的大小。
-h:按使用者易讀的格式輸出大小,即用K替代千位元組,用M替代兆位元組,用G替代吉位元組。
-s:顯示每個輸出引數的總計。

排序資料

sort命令

-b --ignore-leading-blanks 排序時忽略起始的空白
-C --check=quiet 不排序,如果資料無序也不要報告
-c --check 不排序,但檢查輸入資料是不是已排序;未排序的話,報告
-d --dictionary-order 僅考慮空白和字母,不考慮特殊字元
-f --ignore-case 預設情況下,會將大寫字母排在前面;這個引數會忽略大小寫
-g --general-number-sort 按通用數值來排序(跟-n不同,把值當浮點數來排序,支援科學計數法表示的值)
-i --ignore-nonprinting 在排序時忽略不可列印字元
-k --key=POS1[,POS2] 排序從POS1位置開始;如果指定了POS2的話,到POS2位置結束
-M --month-sort 用三字元月份名按月份排序
-m --merge 將兩個已排序資料檔案合併
-n --numeric-sort 按字串數值來排序(並不轉換為浮點數)
-o --output=file 將排序結果寫出到指定的檔案中
-R --random-sort 按隨機生成的散列表的鍵值排序
--random-source=FILE 指定-R引數用到的隨機位元組的原始檔
-r --reverse 反序排序(升序變成降序)
-S --buffer-size=SIZE 指定使用的記憶體大小
-s --stable 禁用最後重排序比較
-T --temporary-directory=DIR 指定一個位置來儲存臨時工作檔案
-t --field-separator=SEP 指定一個用來區分鍵位置的字元
-u --unique 和-c引數一起使用時,檢查嚴格排序;不和-c引數一起用時,僅輸出第一例相似的兩行
-z --zero-terminated 用NULL字元作為行尾,而不是用換行符

-k和-t引數在對按欄位分隔的資料進行排序時非常有用,例如/etc/passwd檔案。可以用-t引數來指定欄位分隔符,然後用-k引數來指定排序的欄位 .

sort -t ':' -k 3 -n /etc/passwd  # 根據使用者ID進行數值排序


du -sh * | sort -nr # -r引數將結果按降序輸出,這樣就更容易看到目錄下的哪些檔案佔用空間最多

搜尋資料

grep命令

grep three file1

grep t file1

grep -v t file1

grep -n t file1

grep -c t file1

grep -e t -e f file1

grep [tf] file1

反向搜尋(輸出不匹配該模式的行),可加-v引數
顯示匹配模式的行所在的行號,可加-n引數
只要知道有多少行含有匹配的模式,可用-c引數.
指定多個匹配模式,可用-e引數

壓縮資料

bzip2       .bz2    採用Burrows-Wheeler塊排序文字壓縮演算法和霍夫曼編碼
compress    .Z      最初的Unix檔案壓縮工具,已經快沒人用了
gzip        .gz     GNU壓縮工具,用Lempel-Ziv編碼
zip         .zip    Windows上PKZIP工具的Unix實現

compress 和 uncompress命令來

gzip:用來壓縮檔案
gzcat:用來檢視壓縮過的文字檔案的內容
gunzip:用來解壓檔案

gzip myprog  # gzip命令會壓縮你在命令列指定的檔案

gzip my*   # 在命令列指定多個檔名甚至用萬用字元來一次性批量壓縮檔案。

歸檔資料

tar命令

-A --concatenate 將一個已有tar歸檔檔案追加到另一個已有tar歸檔檔案
-c --create 建立一個新的tar歸檔檔案
-d --diff 檢查歸檔檔案和檔案系統的不同之處
--delete 從已有tar歸檔檔案中刪除
-r --append 追加檔案到已有tar歸檔檔案末尾
-t --list 列出已有tar歸檔檔案的內容
-u --update 將比tar歸檔檔案中已有的同名檔案新的檔案追加到該tar歸檔檔案中
-x --extract 從已有tar歸檔檔案中提取檔案
-C dir 切換到指定目錄
-f file 輸出結果到檔案或裝置file
-j 將輸出重定向給bzip2命令來壓縮內容
-p 保留所有檔案許可權
-v 在處理檔案時顯示檔案
-z 將輸出重定向給gzip命令來壓縮內容
tar -cvf test.tar test/ test2/  # 建立了名為test.tar的歸檔檔案,含有test和test2目錄內容

tar -tf test.tar  # 列出tar檔案test.tar的內容(但並不提取檔案

tar -xvf test.tar  # 從tar檔案test.tar中提取內容。如果tar檔案是從一個目錄結構建立的,那整個目錄結構都會在當前目錄下重新建立。


第5 章 理解shell

本章內容
* 探究shell的型別
* 理解shell的父/子關係
* 別出心裁的子shell用法
* 探究內建的shell命令

shell 的型別

/bin/bash
/bin/sh
/bin/dash–

程序列表


(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
{ pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $BASH_SUBSHELL; }

小括號程序列表會在一個子shell中執行。花括號的不會。

sleep 3000&

使用 & 把一個命令放到後臺執行。通過jobs可以列出後臺程序。
fg和bg的使用

內建命令/外部命令

which ps

type -a ps

命令歷史 history
使用 !! 快速執行上次的命令
使用 !數字 快速執行history歷史中對應標號的那個命令

alias命令

alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'

第6 章 使用Linux 環境變數

本章內容
* 什麼是環境變數
* 建立自己的區域性變數
* 刪除環境變數
* 預設shell環境變數
* 設定PATH環境變數
* 定位環境檔案
* 陣列變數

什麼是環境變數

bash shell用一個叫作環境變數(environment variable)的特性來儲存有關shell會話和工作環
境的資訊(這也是它們被稱作環境變數的原因)。這項特性允許你在記憶體中儲存資料,以便程式
或shell中執行的指令碼能夠輕鬆訪問到它們。

在bash shell中,環境變數分為兩類:全域性變數, 區域性變數

可以使用env或printenv命令

$ printenv
HOSTNAME=server01.class.edu
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
[...]
HOME=/home/Christine
LOGNAME=Christine
[...]
G_BROKEN_FILENAMES=1
_=/usr/bin/printenv

可以用printenv列印單獨的某一個,env就不行。

$ printenv HOME
/home/Christine
$
$ env HOME
env: HOME: No such file or directory
$

也可以使用echo顯示變數的,在這種情況下引用某個環境變數的時候,必須在變數前面加上一個美元符($)。

$ echo $HOME
/home/Christine
$

區域性環境變數只能在定義它們的程序中可見.

set命令會顯示為某個特定程序設定的所有環境變數,包括區域性變數、全域性變數以及使用者定義變數.

命令env、printenv和set之間的差異很細微。
set命令會顯示出全域性變數、區域性變數以及使用者定義變數。 它還會按照字母順序對結果進行排序。
env和printenv命令同set命令的區別在於前兩個命令不會對變數排序,也不會輸出區域性變數和使用者定義變數。在這種情況下,env和printenv的輸出是重複的。

不過env命令有一個printenv沒有的功能,這使得它要更有用一些。

env - run a program in a modified environment
env可以用來設定某個環境變數來給某個命令

printenv - print all or part of environment
這個僅僅是列印環境變數

設定使用者定義變數

設定區域性變數

一旦啟動了bash shell(或者執行一個shell指令碼),就能建立在這個shell程序內可見的區域性變
量了。可以通過等號給環境變數賦值,值可以是數值或字串


$ echo $my_variable

$ my_variable=Hello    # 記住,變數名、等號和值之間沒有空格,這一點非常重要
$
$ echo $my_variable
Hello

現在每次引用my_variable 環境變數的值,只要通過$my_variable引用即可。

如果要給變數賦一個含有空格的字串值,必須用單引號來界定字串的首和尾。
沒有單引號的話,bash shell會以為下一個詞是另一個要執行的命令


$ my_variable=Hello World
-bash: World: command not found
$
$ my_variable="Hello World"
$
$ echo $my_variable
Hello World
$

所有的環境變數名均使用大寫字母,這是bash shell的標準慣例。
如果是你自己建立的區域性變數或是shell指令碼,請使用小寫字母。
變數名區分大小寫。在涉及使用者定義的區域性變數時堅持使用小寫字母,這能夠避免重新定義系統環境變數可能帶來的災難。

記住,變數名、等號和值之間沒有空格,這一點非常重要


$ my_variable = "Hello World"
-bash: my_variable: command not found
$

設定了局部環境變數後,就能在shell程序的任何地方使用它了。但是,如果生成了另外一個shell,它在子shell中就不可用。 後續我們介紹export讓其在子shell中可用。

$ my_variable="Hello World"
$
$ bash
$
$ echo $my_variable
$ exit
exit
$
$ echo $my_variable
Hello World
$

在這個例子中生成了一個子shell。在子shell中無法使用使用者定義變數my_variable。通過命
令echo $my_variable所返回的空行就能夠證明這一點。當你退出子shell並回到原來的shell時,
這個區域性環境變數依然可用。

類似地,如果你在子程序中設定了一個區域性變數,那麼一旦你退出了子程序,那個區域性環境
變數就不可用。


$ echo $m