1、Linux 爲什麼物node
Linux 就是一個操做系統,就像你多少已經瞭解的 Windows(xp,7,8)和 Max OS ,至於操做系統是什麼,就不用過多解釋了,若是你學習過前面的入門課程,應該會有個基本概念了,這裏簡單介紹下操做系統在整個計算機系統中的角色。python
咱們的 Linux 也就是系統調用和內核那兩層,固然直觀的來看,咱們使用的操做系統還包含一些在其上運行的應用程序,好比文本編輯器,瀏覽器,電子郵件。linux
或許你以前不知道 Linux ,要知道,你以前在 Windows 使用百度,谷歌,上淘寶,聊 QQ 時,支撐這些軟件和服務的,是後臺成千上萬的 Linux 服務器主機,它們時時刻刻都在進行着忙碌的數據處理和運算,能夠說世界上大部分軟件和服務都是運行在 Linux 之上的。git
大體的學習路徑以下:web
相對於如今的 Windows 系統,UNIX/Linux 自己是沒有圖形界面的,咱們一般在 Unix/Linux 發行版上看到的圖形界面實際都只是運行在 Linux 系統之上的一套軟件,相似 Windows95 以前的Windows 的圖形界面實則也只是運行在 DOS 環境的一套軟件。而 Linux 上的這套軟件之前是XFree86,如今則是 xorg(X.Org),而這套軟件又是經過 X 窗口系統(X Window System,也常被稱爲X11或X)實現的,X 自己只是工具包及架構協議,而 xorg 即是 X 架構規範的一個實現體,也就是說它是實現了 X 協議規範的一個提供圖形用戶界面服務的服務器,就像實現了 http 協議提供 web 服務的 Apache。若是隻有服務器也是不能實現一個完整的桌面環境的,固然還須要一個客戶端,咱們稱爲 X Client,像以下幾個你們熟知也最流行的實現了客戶端功能的桌面環境KDE,GNOME,XFCE,LXDE,其中就有你看到的,實驗樓目前使用的 XFCE 桌面環境,部分老用戶可能能夠回想起,實驗樓以前使用的環境是 LXDE。這也意味着在 Linux 上你能夠本身選擇安裝不一樣的桌面環境,甚至能夠定製本身的專屬桌面。正則表達式
一般在咱們使用 Linux 時,咱們並非直接與系統打交道,而是經過一個叫作 Shell 的中間程序來完成的,在圖形界面下爲了實現讓咱們在一個窗口中完成接受用戶輸入和顯示輸出,Linux 系統還提供了一個叫作終端模擬器的程序(Terminal),下面幾個比較常見的終端模擬器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前咱們的實驗中的終端程序是 xfce 桌面環境自帶的 xfce-terminal。不過要注意的是這裏所說的終端(Terminal)和控制檯(Console)是有區別的。shell
一般在咱們使用 Linux 時,咱們並非直接與系統打交道,而是經過一個叫作 Shell 的中間程序來完成的,在圖形界面下爲了實現讓咱們在一個窗口中完成接受用戶輸入和顯示輸出,Linux 系統還提供了一個叫作終端模擬器的程序(Terminal),下面幾個比較常見的終端模擬器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前咱們的實驗中的終端程序是 xfce 桌面環境自帶的 xfce-terminal。不過要注意的是這裏所說的終端(Terminal)和控制檯(Console)是有區別的。數據庫
一般在圖形界面中對實際體驗帶來差別的不是上述的不一樣發行版的各類終端模擬器,而大都是這個 Shell(殼),有殼就有核,這裏的核就是指的 UNIX/Linux 內核,Shell 是指「提供給使用者使用界面」的軟件(命令解析器),相似於 DOS 下的 command(命令行)和後來的 cmd.exe。編程
在 UNIX/Linux 中比較流行的常見的 Shell 有 bash,zsh,ksh,csh 等等,Ubuntu 終端默認使用的是 bash,默認的桌面環境是 GNOME 或者 Unity(基於 GNOME),但咱們的環境中使用的分別是zsh 和 xfce。\]ubuntu
1).重要快捷鍵:
使用Tab
鍵來進行命令補全、補全目錄、補全命令參數,Tab
鍵通常鍵盤是在字母Q
旁邊,這個技巧給你帶來的最大的好處就是當你忘記某個命令的全稱時你能夠只輸入它的開頭的一部分而後按下Tab
鍵就能夠獲得提示或者幫助完成.
使用Ctrl+c
鍵來強行終止當前程序。
雖然這個按着很方便,但不要隨便按,由於有時候當你看到終端沒有任何反應或提示,也不能接受你的輸入,可能只是運行的程序須要你耐心的等一下,你就不要急着Ctrl+c
了。
按鍵 |
做用 |
|
鍵盤輸入結束或退出終端 |
|
暫定當前程序,暫停後按下任意鍵恢復運行 |
|
將當前程序放到後臺運行,恢復到前臺爲命令 |
|
將光標移至輸入行頭,至關於 |
|
將光標移至輸入行末,至關於 |
|
刪除從光標所在位置到行末 |
|
向前刪除一個單詞 |
|
將終端顯示向上滾動 |
|
將終端顯示向下滾動 |
可使用鍵盤上的方向上
鍵,恢復你以前輸入過的命令。
通配符是一種特殊語句,主要有星號(*)和問號(?),用來對對字符串進行模糊匹配(好比文件名,參數名)。當查找文件夾時,可使用它來代替一個或多個真正字符;當不知道真正字符或者懶得輸入完整名字時,經常使用通配符代替一個或多個真正的字符。
通配符 實際上就是一種 Shell 實現的路徑擴展功能。
先使用 touch 命令建立 2 個文件,後綴都爲 txt,而後利用通用符來查詢。
在建立文件的時候,若是須要一次性建立多個文件,好比:「20135212_text_1.txt,20135212_text_2.txt,... 20135212_text_10.txt」。在 Linux 中十分方便:
Shell 經常使用通配符:
字符 |
含義 |
* |
匹配 0 或多個字符 |
? |
匹配任意一個字符 |
[list] |
匹配 list 中的任意單一字符 |
[!list] |
匹配 除list 中的任意單一字符之外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
{c2..c2} |
匹配 c1-c2 中所有字符 如{1..10} |
在 Linux 環境中,若是你遇到困難,可使用man
命令,它是Manual page
的縮寫。
用戶能夠經過執行 man 命令調用手冊頁。
查看 man 命令自己的使用方式,你能夠輸入:
查看相應區段的內容,就在 man 後面加上相應區段的數字便可.
有的手冊頁遵循一個常見的佈局,其爲經過簡單的 ASCII 文本展現而優化,而這種狀況下可能沒有任何形式的高亮或字體控制。通常包括如下部份內容:
NAME(名稱)
該命令或函數的名稱,接着是一行簡介。
SYNOPSIS(概要)
對於命令,正式的描述它如何運行,以及須要什麼樣的命令行參數。對於函數,介紹函數所需的參數,以及哪一個頭文件包含該函數的定義。
DESCRIPTION(說明)
命令或函數功能的文本描述。
EXAMPLES(示例)
經常使用的一些示例。
SEE ALSO(參見)
相關命令或函數的列表。
也可能存在其餘部份內容,但這些部分沒有獲得跨手冊頁的標準化。常見的例子包括:OPTIONS(選項),EXIT STATUS(退出狀態),ENVIRONMENT(環境),BUGS(程序漏洞),FILES(文件),AUTHOR(做者),REPORTING BUGS(已知漏洞),HISTORY(歷史)和COPYRIGHT(版權)。
想要得到更詳細的幫助,你還可使用info
命令,不過一般使用man
就足夠了。若是你知道某個命令的做用,只是想快速查看一些它的某個具體參數的做用,那麼你可使用--help
參數.
做業
Banner:
Printerbanner:
Toilet:
Figlet:
用戶及文件權限管理
1、Linux 用戶管理
Linux 是一個能夠實現多用戶登錄的操做系統,能夠同時登錄同一臺主機,並共享一些主機的資源,但分別有本身的用戶空間,用於存放各自的文件。
1.查看用戶
輸入的第一列表示打開當前僞終端的用戶的用戶名(要查看當前登陸用戶的用戶名,去掉空格直接使用 whoami
便可),第二列的 pts/0
中 pts
表示僞終端,所謂僞是相對於 /dev/tty
設備而言的,還記得上一節講終端時的那七個使用 [Ctrl]
+[Alt]
+[F1]
~
[F7]
進行切換的 /dev/tty
設備麼,這是「真終端」,僞終端就是當你在圖形用戶界面使用 /dev/tty7
時每打開一個終端就會產生一個僞終端, pts/0
後面那個數字就表示打開的僞終端序號,你能夠嘗試再打開一個終端,而後在裏面輸入 who am i
,看第二列是否是就變成 pts/1
了,第三列則表示當前僞終端的啓動時間。
who 命令其它經常使用參數
參數 |
說明 |
-a |
打印能打印的所有 |
-d |
打印死掉的進程 |
-m |
同am i,mom likes |
-q |
打印當前登陸用戶數及用戶名 |
-u |
打印當前登陸用戶登陸信息 |
-r |
打印運行等級 |
在 Linux 系統裏, root
帳戶擁有整個系統至高無上的權利,好比 新建/添加 用戶。
root 權限,系統權限的一種,與 SYSTEM 權限能夠理解成一個概念,但高於 Administrator 權限,root 是 Linux 和 UNIX 系統中的超級管理員用戶賬戶,該賬戶擁有整個系統至高無上的權力,全部對象他均可以操做,因此不少黑客在入侵系統的時候,都要把權限提高到 root 權限,用 Windows 的方法理解也就是將本身的非法賬戶添加到 Administrators 用戶組。更好比安卓操做系統中(基於 Linux 內核)得到 root 權限以後就意味着已經得到了手機的最高權限,這時候你能夠對手機中的任何文件(包括系統文件)執行全部增、刪、改、查的操做。
咱們通常登陸系統時都是以普通帳戶的身份登陸的,要建立用戶須要 root 權限,這裏就要用到 sudo
這個命令了。不過使用這個命令有兩個大前提,一是你要知道當前登陸用戶的密碼,二是當前用戶必須在 sudo
用戶組。shiyanlou 用戶的密碼就是 「shiyanlou」 ,它同時也屬於 sudo 用戶組(稍後會介紹如何查看和添加用戶組)。如今咱們新建一個叫 lilei 的用戶:
切換登入:
在 Linux 裏面每一個用戶都有一個歸屬(用戶組),用戶組簡單地理解就是一組用戶的集合,它們共享一些資源和權限,同時擁有私有資源,就跟家的形式差很少,你的兄弟姐妹(不一樣的用戶)屬於同一個家(用戶組),大家能夠共同擁有這個家(共享資源),爸媽對待大家都同樣(共享權限),你偶爾寫寫日記,其餘人未經容許不能查看(私有資源和權限)。固然一個用戶是能夠屬於多個用戶組的,正如你既屬於家庭,又屬於學校或公司。
方法一:使用groups命令
其中冒號以前表示用戶,後面表示該用戶所屬的用戶組。
/etc/group
文件$ cat /etc/group | sort
這裏 cat
命令用於讀取指定文件的內容並打印到終端輸出,後面會詳細講它的使用。 | sort
表示將讀取的文本進行一個字典排序再輸出,而後你將看到以下一堆輸出,你能夠在最下面看到 shiyanlou 的用戶組信息:
沒找到,不要緊,你可使用命令過濾掉一些你不想看到的結果:
etc/group
文件格式說明/etc/group 的內容包括用戶組(Group)、用戶組口令、GID 及該用戶組所包含的用戶(User),每一個用戶組一條記錄。格式以下:
group_name:password:GID:user_list
你看到上面的 password 字段爲一個 'x' 並非說密碼就是它,只是表示密碼不可見而已。
將其它用戶加入 sudo 用戶組
會提示 chibinning 不在 sudoers 文件中,意思就是chibinning 不在 sudo 用戶組中,至於 sudoers 文件(/etc/sudoers)如今最好不要動它,操做不慎會致使比較麻煩的後果。
使用 usermod
命令能夠爲用戶添加用戶組,一樣使用該命令你必需有 root 權限,你能夠直接使用 root 用戶爲其它用戶添加用戶組,或者用其它已經在 sudo 用戶組的用戶使用 sudo 命令獲取權限來執行該命令
這裏我用 shiyanlou 用戶執行 sudo 命令將 lilei 添加到 sudo 用戶組,讓它也可使用 sudo 命令得到 root 權限
刪除用戶是很簡單的事:
咱們以前已經不少次用到 ls
命令了,如你所見,咱們用它來列出並顯示當前目錄下的文件,固然這是在不帶任何參數的狀況下,它能作的固然不止這麼多,如今咱們就要用它來查看文件權限。
使用較長格式列出文件:
你可能除了知道最後面那一項是文件名以外,其它項就不太清楚了,那麼究竟是什麼意思呢:
可能你仍是不太明白,好比第一項文件類型和權限那一堆東西具體指什麼,連接又是什麼,何爲最後修改時間,下面一一道來:
關於文件類型,這裏有一點你必需時刻牢記Linux 裏面一切皆文件,正由於這一點纔有了設備文件( /dev 目錄下有各類設備文件,大都跟具體的硬件設備相關)這一說,還有 socket(網絡套接字,具體是什麼,感興趣的用戶能夠本身去了解或期待實驗樓的後續相關課程),和 pipe (管道,這個東西很重要,咱們之後將會討論到,這裏你先知道有它的存在便可)。軟連接文件,連接文件是分爲兩種的,另外一種固然是「硬連接」(硬連接不經常使用,具體內容不做爲本課程討論重點,而軟連接等同於 Windows 上的快捷方式,你記住這一點就夠了)
讀權限,表示你可使用 cat <file name> 之類的命令來讀取某個文件的內容;寫權限,表示你能夠編輯和修改某個文件; 執行權限,一般指能夠運行的二進制程序文件或者腳本文件,如同 Windows 上的 'exe' 後綴的文件,不過 Linux 上不是經過文件後綴名來區分文件的類型。你須要注意的一點是,一個目錄要同時具備讀權限和執行權限才能夠打開,而一個目錄要有寫權限才容許在其中建立其它文件,這是由於目錄文件實際保存着該目錄裏面的文件的列表等信息
全部者權限,這一點相信你應該明白了,至於所屬用戶組權限,是指你所在的用戶組中的全部其它用戶對於該文件的權限,好比,你有一個艾派德,那麼這個用戶組權限就決定了你的兄弟姐妹有沒有權限使用它破壞它和佔有它。
連接到該文件所在的 inode 結點的文件名數目(關於這個概念涉及到 Linux 文件系統的相關概念知識,不在本課程的討論範圍,感興趣的用戶能夠本身去了解)。
以 inode 結點大小爲單位來表示的文件大小,你能夠給 ls 加上 -lh 參數來更直觀的查看文件的大小。
明白了文件權限的一些概念,咱們順帶補充一下關於 ls 命令的一些其它經常使用的用法:
$ ls -A
固然,你能夠同時使用 '-A' 和 '-l' 參數:
$ ls -Al
查看某一個目錄的完整屬性,而不是顯示目錄裏面的文件屬性:
$ ls -dl <目錄名>
$ ls -AsSh
其中小 s 爲顯示文件大小,大 S 爲按文件大小排序,若須要知道如何按其它方式排序,請使用「man」命令查詢。
假設目前是 lilei 用戶登陸,新建一個文件,命名爲 「iphone6」:
$ touch iphone6
可見文件全部者是 lilei :
如今,使用如下命令變動文件全部者爲 shiyanlou :
$ cd /home/lilei
$ ls iphone6
$ sudo chown shiyanlou iphone6
$ cp iphone6 /home/shiyanlou
如今查看,發現 文件全部者成功修改成 shiyanlou :
若是你有一個本身的文件不想被其餘用戶讀、寫、執行,那麼就須要對文件的權限作修改,這裏有兩種方式:
每一個文件的三組權限(擁有者,所屬用戶組,其餘用戶,記住這個順序是必定的)就對應這一個 "rwx",也就是一個 '7'
爲了演示,我先在文件里加點內容:
$ echo "echo \"hello shiyanlou\"" > iphone6
而後修改權限:
$ chmod 700 iphone6
如今,其餘用戶已經不能讀這個「iphone6」文件了:
完成上述相同的效果,你能夠:
$ chmod go-rw iphone
'g''o'還有'u',分別表示group,others,user,'+','-' 就分別表示增長和去掉相應的權限。
做業:
1.添加一個用戶loutest
而後建立文件:sudo touch /opt/forloutest
接着,將文件全部者改成用戶loutest:sudo chown loutest /opt/forloutest
最後,修改文件權限,將權限修改成用戶loutest能夠讀寫:sudo chmod 600 /opt/forloutest
一、Linux 的文件組織目錄結構。 二、相對路徑和絕對路徑。 三、對文件的移動、複製、重命名、編輯等操做。
1、Linux 目錄結構
Linux 是以樹形目錄結構的形式來構建整個系統的,能夠理解爲一個用戶可操做系統的骨架。雖然本質上不管是目錄結構仍是操做系統內核都是存儲在磁盤上的,但從邏輯上來講 Linux 的磁盤是「掛在」(掛載在)目錄上的,每個目錄不只能使用本地磁盤分區的文件系統,也可使用網絡上的文件系統。
1.FHS 標準
FHS(英文:Filesystem Hierarchy Standard 中文:文件系統層次結構標準),多數 Linux 版本採用這種文件組織形式,FHS 定義了系統中每一個區域的用途、所須要的最小構成的文件和目錄同時還給出了例外處理與矛盾處理。
FHS 定義了兩層規範,第一層是, / 下面的各個目錄應該要放什麼文件數據,例如 /etc 應該要放置設置文件,/bin 與 /sbin 則應該要放置可執行文件等等。
第二層則是針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如 /var/log 放置系統登陸文件、/usr/share 放置共享數據等等。
關於上面提到的 FHS,這裏還有個很重要的內容你必定要明白,FHS 是根據以往無數 Linux 用戶和開發者的經驗總結出來的,而且會維持更新,FHS 依據文件系統使用的頻繁與否以及是否容許用戶隨意改動(注意,不是不能,學習過程當中,不要怕這些),將目錄定義爲四種交互做用的形態,以下表所示:
有人可能不明白這路徑是指什麼,有什麼用。顧名思義,路徑就是你要去哪兒的路線嘛。若是你想進入某個具體的目錄或者想得到某個目錄的文件(目錄自己也是文件)那就得用路徑來找到了。
使用 cd
命令能夠切換目錄,在 Linux 裏面使用 .
表示當前目錄,..
表示上一級目錄(**注意,還記得咱們上一節介紹過的,以 .
開頭的文件都是隱藏文件,因此這兩個目錄必然也是隱藏的,你可使用 ls -a
命令查看隱藏文件), -
表示上一次所在目錄,~
一般表示當前用戶的"home"目錄。使用 pwd
命令能夠獲取當前所在路徑(絕對路徑)。
進入上一級目錄:
$ cd ..
進入你的「home」目錄:
$ cd ~
# 或者 cd /home/<你的用戶名>
使用 pwd
獲取當前路徑:
$ pwd
關於絕對路徑,簡單地說就是以根"/"目錄爲起點的完整路徑,以你所要到的目錄爲終點,表現形式如: /usr/local/bin
,表示根目錄下的 usr 目錄中的 local 目錄中的 bin 目錄。
相對路徑,也就是相對於你當前的目錄的路徑,相對路徑是以當前目錄 .
爲起點,以你所要到的目錄爲終點,表現形式如: usr/local/bin
(這裏假設你當前目錄爲根目錄)。你可能注意到,咱們表示相對路徑實際並無加上表示當前目錄的那個 .
,而是直接以目錄名開頭,由於這個 usr
目錄爲 /
目錄下的子目錄,是能夠省略這個 .
的(之後會講到一個相似不能省略的狀況);若是是當前目錄的上一級目錄,則須要使用 ..
,好比你當前目錄爲「home」目錄,根目錄就應該表示爲 ../../
,表示上一級目錄("home"目錄)的上一級目錄("/"目錄)。
下面咱們以你的"home"目錄爲起點,分別以絕對路徑和相對路徑的方式進入 /usr/local/bin
目錄:
# 絕對路徑
$ cd /usr/local/bin
# 相對路徑
$ cd ../../usr/local/bin
$ cd ~
$ touch test
使用 mkdir
(make directories)命令能夠建立一個空目錄,也可同時指定建立目錄的權限屬性
建立名爲"mydir"的空目錄:
$ mkdir mydir
使用 -p
參數,同時建立父目錄(若是不存在該父目錄),以下咱們同時建立一個多級目錄(這在有時候安裝軟件,配置安裝路徑時很是有用):
$ mkdir -p father/son/grandson
$ cp test father/son/grandson
若是直接使用cp
命令,複製一個目錄的話,會出現以下錯誤, 要成功複製目錄須要加上-r
或者-R
參數,表示遞歸複製,就是說有點「株連九族」的意思:
使用rm
(remove files or directories)命令,刪除一個文件或目錄:
$ rm test
有時候你會遇到想要刪除一些爲只讀權限的文件,直接使用rm
刪除會顯示一個提示,以下:
你若是想忽略這提示,直接刪除文件,可使用-f
參數強制刪除:
$ rm -f test
跟複製目錄同樣,要刪除一個目錄,也須要加上-r
或-R
參數:
$ rm -r family
使用mv
(move or rename files)命令,移動文件(剪切)。將文件"file1"移動到"Documents"目錄mv
源目錄文件
目的目錄
:
$ mv file1 Documents
將文件"file1"重命名爲"myfile" mv
舊的文件名
新的文件名
:
$ mv file1 myfile
要實現批量重命名,mv 命令就有點力不從心了,咱們可使用一個看起來更專業的命令rename
來實現。不過它是要用 perl 正則表達式來做爲參數,關於正則表達式咱們要在後面纔會介紹到,這裏只作演示,你只要記得這個rename
命令能夠批量重命名就行了,之後再從新學習也不會有任何問題,畢竟你已經掌握了一個更經常使用的mv
命令。
# 使用通配符批量建立 5 個文件
$ touch file{1..5}.txt
# 批量將這 5 個後綴爲 .txt 的文本文件重命名爲以 .c 爲後綴的文件
$ rename 's/\.txt/\.c/' *.txt
# 批量將這 5 個文件,文件名改成大寫
$ rename 'y/a-z/A-Z/' *.c
簡單解釋下上面的命令,rename
是先使用第二個參數的通配符匹配全部後綴爲.txt
的文件,而後使用第一個參數提供的正則表達式將匹配的這些文件的.txt
後綴替換爲.c
,這一點在咱們後面學習了sed
命令後,相信你會更好的理解。
cat
,tac
和nl
命令查看文件這兩個命令都是用來打印文件內容到標準輸出(終端),其中cat
爲正序顯示,tac
倒序顯示。
標準輸入輸出:當咱們執行一個 shell 命令行時一般會自動打開三個標準文件,即標準輸入文件(stdin),默認對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應被重定向到終端的屏幕,以便咱們能直接看到輸出內容。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。
好比咱們要查看以前從"/etc"目錄下拷貝來的passwd
文件:
$ cat passwd
能夠加上-n
參數顯示行號:
$ cat -n passwd
-b : 指定添加行號的方式,主要有兩種:
-b a:表示不管是否爲空行,一樣列出行號("cat -n"就是這種方式)
-b t:只列出非空行的編號並列出(默認爲這種方式)
-n : 設置行號的樣式,主要有三種:
-n ln:在行號字段最左端顯示
-n rn:在行號字段最右邊顯示,且不加 0
-n rz:在行號字段最右邊顯示,且加 0
-w : 行號字段佔用的位數(默認爲 6 位)
使用more
和less
命令分頁查看文件
使用head
和tail
命令查看文件
Tail:查看文件最後幾行的信息
前面我提到過,在 Linux 下面文件的類型不是根據文件後綴來判斷的,咱們一般使用file
命令能夠查看文件的類型:
7.編輯文件
在 Linux 下面編輯文件一般咱們會直接使用專門的命令行編輯器好比(emacs,vim,nano),因爲涉及 Linux 上的編輯器的內容比較多,且很是重要,故咱們有一門單獨的基礎課專門介紹這其中一個編輯器(vim)。
Xeyes:
本節實驗介紹環境變量的做用與用法,及幾種搜索文件的方法。學會這些技巧高效地使用 Linux。
要解釋環境變量,得先明白變量是什麼,準確的說應該是 Shell 變量,所謂變量就是計算機中用於記錄一個值(不必定是數值,也能夠是字符或字符串)的符號,而這些符號將用於不一樣的運算處理中。一般變量與值是一對一的關係,能夠經過表達式讀取它的值賦值給其它變量,也能夠直接指定數值賦值給任意變量。爲了便於運算和處理,大部分的編程語言會區分變量的類型,用於分別記錄數值、字符或者字符串等等數據類型。Shell 中的變量也基本如此,有不一樣類型(但不用專門指定類型名),能夠參與運算,有做用域限定。
變量的做用域即變量的有效範圍(好比一個函數中、一個源文件中或者全局範圍),在該範圍內只能有一個同名變量。一旦離開則該變量無效,如同不存在這個變量通常。
在 Shell 中如何建立一個變量,如何給變量賦值和如何讀取變量的值呢?這部份內容會在bash 腳本編程這門課中詳細介紹,這裏我簡單舉例說明一下:
使用declare
命令建立一個變量名爲 tmp 的變量:
$ declare tmp
其實也能夠不用 declare 預聲明一個變量,直接即用即建立,這裏只是告訴你 declare 的做用,這在建立其它指定類型的變量(如數組)時會用到。
使用=
號賦值運算符爲變量 tmp 賦值爲 shiyanlou:
$ tmp=shiyanlou
讀取變量的值,使用echo
命令和$
符號($符號用於表示引用一個變量的值,初學者常常會忘記輸入):
$ echo $tmp
2.環境變量
一般咱們會涉及到的環境變量有三種:
也有三個與上述三種環境變量相關的命令,set,env,export。這三個命令很類似,均可以用於打印相關環境變量,區別在於涉及的是不一樣範圍的環境變量,詳見下表:
命令 |
說明 |
set |
顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量 |
env |
顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行 |
export |
顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量 |
你可能很早以前就有疑問,咱們在 Shell 中輸入一個命令,Shell 是怎麼知道在哪去找到這個命令而後執行的呢?這是經過環境變量PATH
來進行搜索的,熟悉 Windows 的用戶可能知道 Windows 中的也是有這麼一個 PATH 環境變量。這個PATH
裏面就保存了Shell中執行的命令的搜索路徑。
查看PATH
環境變量的內容:
$ echo $PATH
建立一個Shell腳本文件:
建立一個C語言「hello world」程序:
在前面咱們應該注意到PATH
裏面的路徑是以:
做爲分割符,因此咱們能夠這樣添加自定義路徑:
$ PATH=$PATH:/home/shiyanlou/mybin
咱們能夠簡單的使用下面命令直接添加內容到.zshrc
中:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
變量的修改有如下幾種方式:
變量設置方式 |
說明 |
|
從頭向後開始匹配,刪除符合匹配字串的最短數據 |
|
從頭向後開始匹配,刪除符合匹配字串的最長數據 |
|
從尾向前開始匹配,刪除符合匹配字串的最短數據 |
|
從尾向前開始匹配,刪除符合匹配字串的最長數據 |
|
將符合舊字串的第一個字串替換爲新的字串 |
|
將符合舊字串的所有字串替換爲新的字串 |
好比要修改咱們前面添加到 PATH 的環境變量。爲了不操做失誤致使命令找不到,咱們先將 PATH 賦值給一個新的自定義變量 path:
$ path=$PATH
$ echo $path
$ path=${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多個任意字符
$ path=${path%*/mybin}
可使用unset
命令刪除一個環境變量:
$ unset temp
在上面咱們在 Shell 中修改了一個配置腳本文件以後(好比 zsh 的配置文件 home 目錄下的.zshrc
),每次都要退出終端從新打開甚至重啓主機以後其才能生效,非常麻煩,咱們可使用source
命令來讓其當即生效,如:
$ source .zshrc
source
命令還有一個別名就是.
,注意與表示當前路徑的那個點區分開,雖然形式同樣,但做用和使用方式同樣,上面的命令若是替換成.
的方式就該是
$ . ./.zshrc
注意第一個點後面有一個空格,並且後面的文件必須指定完整的絕對或相對路徑名,source 則不須要。
2、搜索文件
與搜索相關的命令經常使用的有以下幾個whereis,which,find,locate。
$whereis who
你會看到它找到了三個路徑,兩個可執行文件路徑和一個 man 在線幫助文件所在路徑,這個搜索很快,由於它並無從硬盤中依次查找,而是直接從數據庫中查詢。whereis只能搜索二進制文件(-b),man幫助文件(-m)和源代碼文件(-s)。若是想要得到更全面的搜索結果可使用locate命令。
經過"/var/lib/mlocate/mlocate.db"數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務天天自動執行updatedb命令更新一次,因此有時候你剛添加的文件,它可能會找不到,須要手動執行一次updatedb命令(在咱們的環境中必須先執行一次該命令)。它能夠用來查找指定目錄下的不一樣文件類型,如查找 /etc 下全部以 sh 開頭的文件:
$ locate /etc/sh
注意,它不僅是在 etc 目錄下查找並會自動遞歸子目錄進行查找
查找 /usr/share/ 下全部 jpg 文件:
$ locate /usr/share/\*.jpg
注意要添加*號前面的反斜槓轉義,不然會沒法找到
若是想只統計數目能夠加上-c參數,-i參數能夠忽略大小寫進行查找,whereis 的-b,-m,-s一樣能夠是使用。
which自己是 Shell 內建的一個命令,咱們一般使用which來肯定是否安裝了某個指定的軟件,由於它只從PATH環境變量指定的路徑中去搜索命令:
$ which man
find應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。find命令強大到,要把它將明白至少須要單獨好幾節課程才行,咱們這裏只介紹一些經常使用的內容。
在指定目錄下搜索指定文件名的文件:
$ find /etc/ -name interfaces
注意 find 命令的路徑是做爲第一個參數的,基本命令格式爲 find [path] [option] [action]
與時間相關的命令參數:
參數 |
說明 |
-atime |
最後訪問時間 |
-ctime |
建立時間 |
-mtime |
最後修改時間 |
下面以-mtime參數舉例:
列出 home 目錄中,當天(24 小時以內)有改動的文件:
$ find ~ -mtime 0
列出用戶家目錄下比Code文件夾新的文件:
$ find ~ -newer /home/shiyanlou/Code
做業:
Linux 上經常使用的 壓縮/解壓 工具,介紹了 zip,rar,tar 的使用。
在講 Linux 上的解壓縮工具以前,有必要先了解如下常見經常使用的壓縮包文件格式。在 Windows 上咱們最多見的不外乎這三種*.zip
,*.rar
,*.7z
後綴的壓縮文件,而在 Linux 上面常見經常使用的除了以上這三種外,還有*.gz
,*.xz
,*.bz2
,*.tar
,*.tar.gz
,*.tar.xz
,*tar.bz2
,簡單介紹以下:
文件後綴名 |
說明 |
|
zip程序打包壓縮的文件 |
|
rar程序壓縮的文件 |
|
7zip程序壓縮的文件 |
|
tar程序打包,未壓縮的文件 |
|
gzip程序(GNU zip)壓縮的文件 |
|
xz程序壓縮的文件 |
|
bzip2程序壓縮的文件 |
|
tar打包,gzip程序壓縮的文件 |
|
tar打包,xz程序壓縮的文件 |
|
tar打包,bzip2程序壓縮的文件 |
|
tar打包,7z程序壓縮的文件 |
講了這麼多種壓縮文件,這麼多個命令,不過咱們通常只須要掌握幾個命令便可,包括zip
,rar
,tar
。下面會依次介紹這幾個命令及對應的解壓命令。
zip
壓縮打包程序$ zip -r -q -o shiyanlou.zip /home/shiyanlou
$ du -h shiyanlou.zip
$ file shiyanlou.zip
上面命令將 shiyanlou 的 home 目錄打包成一個文件,並查看了打包後文件的大小和類型。第一行命令中,-r參數表示遞歸打包包含子目錄的所有內容,-q參數表示爲安靜模式,即不向屏幕輸出信息,-o,表示輸出文件,需在其後緊跟打包輸出文件名。後面使用du命令查看打包後文件的大小(後面會具體說明該命令)。
$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip
$ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip
這裏添加了一個參數用於設置壓縮級別-[1-9],1表示最快壓縮但體積大,9表示體積最小但耗時最久。最後那個-x是爲了排除咱們上一次建立的 zip 文件,不然又會被打包進這一次的壓縮文件中,注意:這裏只能使用絕對路徑,不然不起做用。
咱們再用du
命令分別查看默認壓縮級別、最低、最高壓縮級別及未壓縮的文件的大小:
$ du -h -d 0 *.zip ~ | sort
使用-e
參數能夠建立加密壓縮包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou
unzip
命令解壓縮zip文件將shiyanlou.zip
解壓到當前目錄:
$ unzip shiyanlou.zip
使用安靜模式,將文件解壓到指定目錄:
$ unzip -q shiyanlou.zip -d ziptest
rar
打包壓縮命令rar
也是 Windows 上經常使用的一種壓縮文件格式,在 Linux 上可使用rar
和unrar
工具分別建立和解壓 rar 壓縮包。
rar
和unrar
工具:$ sudo apt-get update
$ sudo apt-get install rar unrar
$ rm *.zip
$ rar a shiyanlou.rar .
上面的命令使用a
參數添加一個目錄~
到一個歸檔文件中,若是該文件不存在就會自動建立。
注意:rar 的命令參數沒有-
,若是加上會報錯。
unrar
解壓rar
文件$ rar d shiyanlou.rar .zshrc
$ rar l shiyanlou.rar
全路徑解壓:
$ unrar x shiyanlou.rar
去掉路徑解壓:
$ mkdir tmp
$ unrar e shiyanlou.rar tmp/
rar命令參數很是多,上面只涉及了一些基本操做
4如今咱們要使用其餘的壓縮工具建立或解壓相應文件只須要更改一個參數便可:
壓縮文件格式 |
參數 |
*.tar.gz |
-z |
*.tar.xz |
-J |
*tar.bz2 |
-j |
tar
打包工具在 Linux 上面更經常使用的是tar
工具,tar 本來只是一個打包工具,只是同時仍是實現了對 7z,gzip,xz,bzip2 等工具的支持,這些壓縮工具自己只能實現對文件或目錄(單獨壓縮目錄中的文件)的壓縮,沒有實現對文件的打包壓縮,因此咱們也無需再單獨去學習其餘幾個工具,tar 的解壓和壓縮都是同一個命令,只需參數不一樣,使用比較方便。
下面先掌握tar
命令一些基本的使用方式,即不進行壓縮只是進行打包(建立歸檔文件)和解包的操做。
$ tar -cf shiyanlou.tar ~
$ df
rootfs" : (Root File System)它是 Ramfs(Ramfs 是一個很是簡單的 Linux 文件系統用於實現磁盤緩存機制做爲動態可調整大小的基於 ram 的文件系統)或者 tmpfs 的一個特殊實例,它做爲系統啓動時內核載入內存以後,在掛載真正的的磁盤以前的一個臨時文件系統。一般的主機會在系統啓動後用磁盤上的文件系統替換,只是在一些嵌入式系統中會只存在一個 rootfs ,或者像咱們目前遇到的狀況運行在虛擬環境中共享主機資源的系統也可能會採用這種方式。
$ df -h
這個命令前面其實已經用了不少次了:
# 默認一樣以 blocks 的大小展現
$ du
# 加上`-h`參數,以更易讀的方式展現
$ du -h
-d
參數指定查看目錄的深度
# 只查看1級目錄的信息
$ du -h -d 0 ~
# 查看2級
$ du -h -d 1 ~
2、簡單的磁盤管理
dd
命令用於轉換和複製文件,不過它的複製不一樣於cp
。以前提到過關於 Linux 的很重要的一點,一切即文件,在 Linux 上,硬件的設備驅動(如硬盤)和特殊設備文件(如/dev/zero
和/dev/random
)都像普通文件同樣,只要在各自的驅動程序中實現了對應的功能,dd 也能夠讀取自和/或寫入到這些文件。這樣,dd
也能夠用在備份硬件的引導扇區、獲取必定數量的隨機數據或者空數據等任務中。dd
程序也能夠在複製時處理數據,例如轉換字節序、或在 ASCII 與 EBCDIC 編碼間互換。
dd
的命令行語句與其餘的 Linux 程序不一樣,由於它的命令行選項格式爲選項
=
值
,而不是更標準的--
選項
值
或-
選項
=
值
。dd
默認從標準輸入中讀取,並寫入到標準輸出中,但能夠用選項if
(input file,輸入文件)和of
(output file,輸出文件)改變。
咱們先來試試用dd
命令從標準輸入讀入用戶輸入到標準輸出或者一個文件:
# 輸出到文件
$ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1
# 輸出到標準輸出
$ dd if=/dev/stdin of=/dev/stdout bs=10 count=1
經過上面一小節,你應該掌握了dd
的基本使用,下面就來使用dd
命令來完成建立虛擬磁盤的第一步。
從/dev/zero
設備建立一個容量爲 256M 的空文件:
$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ du -h virtual.img
你能夠在命令行輸入 mkfs 而後按下Tab
鍵,你能夠看到不少個以 mkfs 爲前綴的命令,這些不一樣的後綴其實就是表示着不一樣的文件系統,能夠用 mkfs 格式化成的文件系統:
咱們能夠簡單的使用下面的命令來將咱們的虛擬磁盤鏡像格式化爲ext4
文件系統:
$ mkfs.ext4 virtual.img
用戶在 Linux/UNIX 的機器上打開一個文件之前,包含該文件的文件系統必須先進行掛載的動做,此時用戶要對該文件系統執行 mount 的指令以進行掛載。一般是使用在 USB 或其餘可移除存儲設備上,而根目錄則須要始終保持掛載的狀態。又由於 Linux/UNIX 文件系統能夠對應一個文件而不必定要是硬件設備,因此能夠掛載一個包含文件系統的文件到目錄樹。
Linux/UNIX 命令行的 mount 指令是告訴操做系統,對應的文件系統已經準備好,可使用了,而該文件系統會對應到一個特定的點(稱爲掛載點)。掛載好的文件、目錄、設備以及特殊文件便可提供用戶使用。
咱們先來使用mount
來查看下主機已經掛載的文件系統:
$ sudo mount
那麼咱們如何掛載真正的磁盤到目錄樹呢,mount
命令的通常格式以下:
mount [options] [source] [directory]
一些經常使用操做:
mount [-o [操做選項]] [-t 文件系統類型] [-w|--rw|--ro] [文件系統源] [掛載點]
2.有選擇的執行命令
上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which
來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作
&&
就是用來實現選擇性執行的,它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行
||
就是與&&
相反的控制效果
管道是什麼,管道是一種通訊機制,一般用於進程間的通訊(也可經過socket進行網絡通訊),它表現出來的形式就是將前面每個進程的輸出(stdout)直接做爲下一個進程的輸入(stdin)。
管道又分爲匿名管道和具名管道(這裏將不會討論在源程序中使用系統調用建立並使用管道的狀況,它與命令行的管道在內核中實際都是採用相同的機制)。咱們在使用一些過濾程序時常常會用到的就是匿名管道,在命令行中由|
分隔符表示,|
在前面的內容中咱們已經屢次使用到了。
先試用一下管道,好比查看/etc
目錄下有哪些文件和目錄,使用ls
命令來查看:
$ ls -al /etc
打印/etc/passwd
文件中以:
爲分隔符的第1個字段和第6個字段分別表示用戶名和其家目錄:
$ cut /etc/passwd -d ':' -f 1,6
打印/etc/passwd
文件中每一行的前N個字符:
# 前五個(包含第五個)
$ cut /etc/passwd -c -5
# 前五個以後的(包含第五個)
$ cut /etc/passwd -c 5-
# 第五個
$ cut /etc/passwd -c 5
# 2到5之間的(包含第五個)
$ cut /etc/passwd -c 2-5
grep
命令是很強大的,也是至關經常使用的一個命令,它結合正則表達式能夠實現很複雜卻很高效的匹配和查找,不過在學習正則表達式以前,這裏介紹它簡單的使用,而關於正則表達式後面將會有單獨一小節介紹到時會再繼續學習grep
命令和其餘一些命令。
grep
命令的通常形式爲:
grep [命令選項]... 用於匹配的表達式 [文件]...
-r
參數表示遞歸搜索子目錄中的文件,-n
表示打印匹配項行號,-I
表示忽略二進制文件。這個操做實際沒有多大意義,但能夠感覺到grep
命令的強大與實用。
wc 命令用於統計並輸出一個文件中行、單詞和字節的數目,好比輸出/etc/passwd
文件的統計信息:
$ wc /etc/passwd
分別只輸出行數、單詞數、字節數、字符數和輸入文本中最長一行的字節數:
# 行數
$ wc -l /etc/passwd
# 單詞數
$ wc -w /etc/passwd
# 字節數
$ wc -c /etc/passwd
# 字符數
$ wc -m /etc/passwd
# 最長行字節數
$ wc -L /etc/passwd
這個命令前面咱們也是用過屢次,功能很簡單就是將輸入按照必定方式排序,而後再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。
默認爲字典排序:
$ cat /etc/passswd | sort
反轉排序:
$ cat /etc/passwd | sort -r
按特定字段排序:
$ cat /etc/passwd | sort -t':' -k 3
上面的-t
參數用於指定字段的分隔符,這裏是以":"做爲分隔符;-k
字段號
用於指定對哪個字段進行排序。這裏/etc/passwd
文件的第三個字段爲數字,默認狀況下是一字典序排序的,若是要按照數字排序就要加上-n
參數:
$ cat /etc/passwd | sort -t':' -k 3 -n
uniq
命令能夠用於過濾或者輸出重複行。
咱們可使用history
命令查看最近執行過的命令(實際爲讀取${SHELL}_history文件,如咱們環境中的~/.zsh_history文件),不過你可能只想查看使用了那個命令而不須要知道具體幹了什麼,那麼你可能就會要想去掉命令後面的參數而後去掉重複的命令:
$ history | cut -c 8- | cut -d ' ' -f 1 | uniq
而後通過層層過濾,你會發現確是只輸出了執行的命令那一列,不過去重效果好像不明顯,仔細看你會發現它趨勢去重了,只是不那麼明顯,之因此不明顯是由於uniq
命令只能去連續重複的行,不是全文去重,因此要達到預期效果,咱們先排序:
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u
這就是 Linux/UNIX 哲學吸引人的地方,大繁至簡,一個命令只幹一件事卻能幹到最好。
# 輸出重複過的行(重複的只輸出一個)及重複次數
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 輸出全部重複的行
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
tr 命令能夠用來刪除一段文本信息中的某些文字。或者將其進行轉換。
tr [option]...SET1 [SET2]
選項 |
說明 |
|
刪除和set1匹配的字符,注意不是全詞匹配也不是按字符順序匹配 |
|
去除set1指定的在輸入文本中連續並重復的字符 |
# 刪除 "hello shiyanlou" 中全部的'o','l','h'
$ echo 'hello shiyanlou' | tr -d 'olh'
# 將"hello" 中的ll,去重爲一個l
$ echo 'hello' | tr -s 'l'
# 將輸入文本,所有轉換爲大寫或小寫輸出
$ cat /etc/passwd | tr '[:lower:]' '[:upper:]'
# 上面的'[:lower:]' '[:upper:]'你也能夠簡單的寫做'[a-z]' '[A-Z]',固然反過來將大寫變小寫也是能夠的
col 命令能夠將Tab
換成對等數量的空格建,或反轉這個操做。
col [option]
選項 |
說明 |
|
將 |
|
將空格轉換爲 |
# 查看 /etc/protocols 中的不可見字符,能夠看到不少 ^I ,這其實就是 Tab 轉義成可見字符的符號
$ cat -A /etc/protocols
# 使用 col -x 將 /etc/protocols 中的 Tab 轉換爲空格,而後再使用 cat 查看,你發現 ^I 不見了
$ cat /etc/protocols | col -x | cat -A
學過數據庫的用戶對這個應該不會陌生,這個命令就是用於將兩個文件中包含相同內容的那一行合併在一塊兒。
join [option]... file1 file2
選項 |
說明 |
|
指定分隔符,默認爲空格 |
|
忽略大小寫的差別 |
|
指明第一個文件要用哪一個字段來對比,,默認對比第一個字段 |
|
指明第二個文件要用哪一個字段來對比,,默認對比第一個字段 |
# 建立兩個文件
$ echo '1 hello' > file1
$ echo '1 shiyanlou' > file2
$ join file1 file2
# 將/etc/passwd與/etc/shadow兩個文件合併,指定以':'做爲分隔符
$ sudo join -t':' /etc/passwd /etc/shadow
# 將/etc/passwd與/etc/group兩個文件合併,指定以':'做爲分隔符, 分別比對第4和第3個字段
$ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group
paste
這個命令與join
命令相似,它是在不對比數據的狀況下,簡單地將多個文件合併一塊兒,以Tab
隔開。
paste [option] file...
選項 |
說明 |
|
指定合併的分隔符,默認爲Tab |
|
不合併到一行,每一個文件爲一行 |
$ echo hello > file1
$ echo shiyanlou > file2
$ echo www.shiyanlou.com > file3
$ paste -d ':' file1 file2 file3
$ paste -s file1 file2 file3
下面咱們簡單的回顧一下咱們前面常常用到的兩個重定向操做:
$ echo 'hello shiyanlou' > redirect
$ echo 'www.shiyanlou.com' >> redirect
$ cat redirect
固然前面沒有用到的<
和<<
操做也是沒有問題的,如你理解的同樣,它們的區別在於重定向的方向不一致而已,>
表示是從左到右,<
右到左。
在更多瞭解 Linux 的重定向以前,咱們須要先知道一些基本的東西,前面咱們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別爲stdin
(標準輸入,對應於你在終端的輸入),stdout
(標準輸出,對應於終端的輸出),stderr
(標準錯誤輸出,對應於終端的輸出)。
文件描述符 |
設備文件 |
說明 |
|
|
標準輸入 |
|
|
標準輸出 |
|
|
標準錯誤 |
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫每每會圍繞着文件描述符展開。可是文件描述符這一律念每每只適用於 UNIX、Linux 這樣的操做系統。
另外還有一個符號-
,它能夠同時做爲前一個命令的。
咱們能夠這樣使用這些文件描述符:
默認使用終端的標準輸入做爲命令的輸入和標準輸出做爲命令的輸出
$ cat
(按Ctrl+C退出)
將cat的連續輸出(heredoc方式)重定向到一個文件
$ mkdir Documents
$ cat > Documents/test.c\~ <<EOF
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
EOF
將一個文件做爲命令的輸入,標準輸出做爲命令的輸出
$ cat Documents/test.c\~
將echo命令經過管道傳過來的數據做爲cat命令的輸入,將標準輸出做爲命令的輸出
$ echo 'hi' | cat
將echo命令的輸出從默認的標準輸出重定向到一個普通文件
$ echo 'hello shiyanlou' > redirect
$ cat redirect
重定向標準輸出到文件,這是一個很實用的操做,另外一個很實用的操做是將標準錯誤重定向,標準輸出和標準錯誤都被指向僞終端的屏幕顯示,因此咱們常常看到的一個命令的輸出一般是同時包含了標準輸出和標準錯誤的結果的。好比下面的操做:
# 使用cat 命令同時讀取兩個文件,其中一個存在,另外一個不存在
$ cat Documents/test.c\~ hello.c
# 你能夠看到除了正確輸出了前一個文件的內容,還在末尾出現了一條錯誤信息
# 下面咱們將輸出重定向到一個文件,根據咱們前面的經驗,這裏將在看不到任何輸出了
$ cat Documents/test.c\~ hello.c > somefile
遺憾的是,這裏依然出現了那條錯誤信息,這正是由於如我上面說的那樣,標準輸出和標準錯誤雖然都指向終端屏幕,實際它們並不同。那有的時候咱們就是要能夠隱藏某些錯誤或者警告,那又該怎麼作呢。這就須要用到咱們前面講的文件描述符了:
# 將標準錯誤重定向到標準輸出,再將標準輸出重定向到文件,注意要將重定向到文件寫到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符號"&"將標準錯誤和標準輸出同時重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
注意你應該在輸出重定向文件描述符前加上&
,不然shell會當作重定向到一個文件名爲1的文件中
tee
命令同時重定向到多個文件常常你可能還有這樣的需求,除了將須要將輸出重定向到文件以外也須要將信息打印在終端,那麼你可使用tee
命令來實現:
$ echo 'hello shiyanlou' | tee hello
你應該能夠看出咱們前面的重定向操做都只是臨時性的,即只對當前命令有效,那如何作到「永久」有效呢,好比在一個腳本中,你須要某一部分的命令的輸出所有進行重定向,難道要讓你在每一個命令上面加上臨時重定向的操做嘛,固然不須要,咱們可使用exec
命令實現「永久」重定向。exec
命令的做用是使用指定的命令替換當前的 Shell,及使用一個進程替換當前進程,或者指定新的重定向:
# 先開啓一個子 Shell
$ zsh
# 使用exec替換當前進程的重定向,將標準輸出重定向到一個文件
$ exec 1>somefile
# 後面你執行的命令的輸出都將被重定向到文件中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼作)
$ ls
$ exit
$ cat somefile
默認在 Shell 中能夠有9個打開的文件描述符,上面咱們使用了也是它默認提供的0
,1
,2
號文件描述符,另外咱們還可使用3-8的文件描述符,只是它們默認沒有打開而已,你可使用下面命令查看當前 Shell 進程中打開的文件描述符:
$ cd /dev/fd/;ls -Al
一樣使用exec
命令能夠建立新的文件描述符:
$ zsh
$ exec 3>somefile
# 先進入目錄,再查看,不然你可能不能獲得正確的結果,而後再回到上一次的目錄
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>與&之間不該該有空格,若是有空格則會出錯
$ echo "this is test" >&3
$ cat somefile
$ exit
如上面咱們打開的3號文件描述符,可使用以下操做將它關閉:
$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
在 Linux 中有一個被成爲「黑洞」的設備文件,因此導入它的數據都將被「吞噬」。
在類 UNIX 系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它一般被用於丟棄不須要的輸出流,或做爲用於輸入流的空文件,這些操做一般由重定向完成。讀取它則會當即獲得一個EOF。
咱們能夠利用設個/dev/null
屏蔽命令的輸出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
向上面這樣的操做將使你得不到任何輸出結果。
xargs 是一條 UNIX 和類 UNIX 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd
文件按:
分割取第一個字段排序後,使用echo
命令生成一個列表。
什麼是正則表達式呢?
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。
一個正則表達式一般被稱爲一個模式(pattern),爲用來描述或者匹配一系列符合某個句法規則的字符串。
|
豎直分隔符表示選擇,例如"boy|girl"能夠匹配"boy"或者"girl"
數量限定除了咱們舉例用的*
,還有+
加號,?
問號,.
點號,若是在一個模式中不加數量限定符則表示出現一次且僅出現一次:
+
表示前面的字符必須出現至少一次(1次或屢次),例如,"goo+gle",能夠匹配"gooogle","goooogle"等;?
表示前面的字符最多出現一次(0次或1次),例如,"colou?r",能夠匹配"color"或者"colour";*
星號表明前面的字符能夠不出現,也能夠出現一次或者屢次(0次、或1次、或屢次),例如,「0*42」能夠匹配4二、04二、004二、00042等。()
圓括號能夠用來定義模式字符串的範圍和優先級,這能夠簡單的理解爲是否將括號內的模式串做爲一個總體。例如,"gr(a|e)y"等價於"gray|grey",(這裏體現了優先級,豎直分隔符用於選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這裏體驗了範圍,?
將圓括號內容做爲一個總體匹配)。
正則表達式有多種不一樣的風格,下面列舉一些經常使用的做爲 PCRE 子集的適用於perl
和python
編程語言及grep
或egrep
的正則表達式匹配規則:(因爲markdown表格解析的問題,下面的豎直分隔符用全角字符代替,實際使用時請換回半角字符)
PCRE(Perl Compatible Regular Expressions中文含義:perl語言兼容正則表達式)是一個用 C 語言編寫的正則表達式函數庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個輕量級的函數庫,比Boost 之類的正則表達式庫小得多。PCRE 十分易用,同時功能也很強大,性能超過了 POSIX 正則表達式庫和一些經典的正則表達式庫。
字符 |
描述 |
\ |
將下一個字符標記爲一個特殊字符、或一個原義字符。例如,「n」匹配字符「n」。「\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。 |
^ |
匹配輸入字符串的開始位置。 |
$ |
匹配輸入字符串的結束位置。 |
{n} |
n是一個非負整數。匹配肯定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,可是能匹配「food」中的兩個o。 |
{n,} |
n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的全部o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。 |
{n,m} |
m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。 |
* |
匹配前面的子表達式零次或屢次。例如,zo*能匹配「z」、「zo」以及「zoo」。*等價於{0,}。 |
+ |
匹配前面的子表達式一次或屢次。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。 |
? |
匹配前面的子表達式零次或一次。例如,「do(es)?」能夠匹配「do」或「does」中的「do」。?等價於{0,1}。 |
? |
當該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配全部「o」。 |
. |
匹配除「\n」以外的任何單個字符。要匹配包括「\n」在內的任何字符,請使用像「(.|\n)」的模式。 |
(pattern) |
匹配pattern並獲取這一匹配的子字符串。該子字符串用於向後引用。要匹配圓括號字符,請使用「\(」或「\)」。 |
x|y |
匹配x或y。例如,「z|food」能匹配「z」或「food」。「(z|f)ood」則匹配「zood」或「food」。 |
[xyz] |
字符集合(character class)。匹配所包含的任意一個字符。例如,「[abc]」能夠匹配「plain」中的「a」。其中特殊字符僅有反斜線\保持特殊含義,用於轉義字符。其它特殊字符如星號、加號、各類括號等均做爲普通字符。脫字符^若是出如今首位則表示負值字符集合;若是出如今字符串中間就僅做爲普通字符。連字符 |
[^xyz] |
排除型(negate)字符集合。匹配未列出的任意字符。例如,「[^abc]」能夠匹配「plain」中的「plin」。 |
[a-z] |
字符範圍。匹配指定範圍內的任意字符。例如,「[a-z]」能夠匹配「a」到「z」範圍內的任意小寫字母字符。 |
[^a-z] |
排除型的字符範圍。匹配任何不在指定範圍內的任意字符。例如,「[^a-z]」能夠匹配任何不在「a」到「z」範圍內的任意字符。 |
優先級爲從上到下從左到右,依次下降:
運算符 |
說明 |
\ |
轉義符 |
(), (?:), (?=), [] |
括號和中括號 |
*、+、?、{n}、{n,}、{n,m} |
限定符 |
^、$、\任何元字符 |
定位點和序列 |
| |
選擇 |
上面空談了那麼多正則表達式的內容也並無說起具體該如何使用它,實在枯燥,若是說正則表達式是一門武功話,那它也只能算得上一些口訣招式罷了,要把它真正練起來還得須要一些兵器在手才行,這裏咱們要介紹的grep
命令以及後面要講的sed
,awk
這些就該算做是這樣的兵器了。
grep
命令用於打印輸出文本中匹配的模式串,它使用正則表達式做爲模式匹配的條件。grep
支持三種正則表達式引擎,分別用三個參數指定:
參數 |
說明 |
|
POSIX擴展正則表達式,ERE |
|
POSIX基本正則表達式,BRE |
|
Perl正則表達式,PCRE |
不過在你沒學過perl語言的大多數狀況下你將只會使用到ERE
和BRE
,因此咱們接下來的內容都不會討論到PCRE中特有的一些正則表達式語法(它們之間大部份內容是存在交集的,因此你不用擔憂會遺漏多少重要內容)
在經過grep
命令使用正則表達式以前,先介紹一下它的經常使用參數:
參數 |
說明 |
|
將二進制文件做爲文原本進行匹配 |
|
統計以模式匹配的數目 |
|
忽略大小寫 |
|
顯示匹配文本所在行的行號 |
|
反選,輸出不匹配行的內容 |
|
遞歸匹配查找 |
|
n爲正整數,表示after的意思,除了列出匹配行以外,還列出後面的n行 |
|
n爲正整數,表示before的意思,除了列出匹配行以外,還列出前面的n行 |
|
將輸出中的匹配項設置爲自動顏色顯示 |
注:在大多數發行版中是默認設置了grep的顏色的,你能夠經過參數指定或修改GREP_COLOR
環境變量。
查找/etc/group
文件中以"shiyanlou"爲開頭的行
$ grep 'shiyanlou' /etc/group
$ grep '^shiyanlou' /etc/group
# 將匹配以'z'開頭以'o'結尾的全部字符串
$ echo 'zero\nzo\nzoo' | grep 'z.*o'
# 將匹配以'z'開頭以'o'結尾,中間包含一個任意字符的字符串
$ echo 'zero\nzo\nzoo' | grep 'z.o'
# 將匹配以'z'開頭,以任意多個'o'結尾的字符串
$ echo 'zero\nzo\nzoo' | grep 'zo*'
# grep默認是區分大小寫的,這裏將匹配全部的小寫字母
$ echo '1234\nabcd' | grep '[a-z]'
# 將匹配全部的數字
$ echo '1234\nabcd' | grep '[0-9]'
# 將匹配全部的數字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 將匹配全部的小寫字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 將匹配全部的大寫字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 將匹配全部的字母和數字,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 將匹配全部的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'
下面包含完整的特殊符號及說明:
特殊符號 |
說明 |
[:alnum:] |
表明英文大小寫字節及數字,亦即 0-9, A-Z, a-z |
[:alpha:] |
表明任何英文大小寫字節,亦即 A-Z, a-z |
[:blank:] |
表明空白鍵與 [Tab] 按鍵二者 |
[:cntrl:] |
表明鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] |
表明數字而已,亦即 0-9 |
[:graph:] |
除了空白字節 (空白鍵與 [Tab] 按鍵) 外的其餘全部按鍵 |
[:lower:] |
表明小寫字節,亦即 a-z |
[:print:] |
表明任何能夠被列印出來的字節 |
[:punct:] |
表明標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $... |
[:upper:] |
表明大寫字節,亦即 A-Z |
[:space:] |
任何會產生空白的字節,包括空白鍵, [Tab], CR 等等 |
[:xdigit:] |
表明 16 進位的數字類型,所以包括: 0-9, A-F, a-f 的數字與字節 |
要經過grep
使用擴展正則表達式須要加上-E
參數,或使用egrep
。
# 只匹配"zo"
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1}'
# 匹配以"zo"開頭的全部單詞
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'
注意:推薦掌握{n,m}
便可,+
,?
,*
,這幾個不太直觀,且容易弄混淆。
# 匹配"www.shiyanlou.com"和"www.google.com"
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com'
# 或者匹配不包含"baidu"的內容
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'
sed
工具在 man 手冊裏面的全名爲"sed - stream editor for filtering and transforming text ",意即,用於過濾和轉換文本的流編輯器。
在 Linux/UNIX 的世界裏敢稱爲編輯器的工具,大都非等閒之輩,好比前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個編輯器。sed
與上述的最大不一樣之處大於它是一個非交互式的編輯器,下面咱們就開始介紹sed
這個編輯器。
sed 命令基本格式:
sed [參數]... [執行命令] [輸入文件]...
# 形如:
$ sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換爲"happy"
參數 |
說明 |
|
安靜模式,只打印受影響的行,默認打印輸入數據的所有內容 |
|
用於在腳本中添加多個執行命令一次執行,在命令行中執行多個命令一般不須要加該參數 |
|
指定執行filename文件中的命令 |
|
使用擴展正則表達式,默認爲標準正則表達式 |
|
將直接修改輸入文件內容,而不是打印到標準輸出設備 |
sed執行命令格式:
[n1][,n2]command
[n1][~step]command
# 其中一些命令能夠在後面加上做用範圍,形如:
$ sed -i 's/sad/happy/g' test # g表示全局範圍
$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四個匹配字符串
其中n1,n2表示輸入內容的行號,它們之間爲,
逗號則表示從n1到n2行,若是爲~
波浪號則表示從n1開始以step爲步進的全部行;command爲執行動做,下面爲一些經常使用動做指令:
命令 |
說明 |
|
行內替換 |
|
整行替換 |
|
插入到指定行的後面 |
|
插入到指定行的前面 |
|
打印指定行,一般與 |
|
刪除指定行 |
# 打印2-5行
$ nl passwd | sed -n '2,5p'
# 打印奇數行
$ nl passwd | sed -n '1~2p'
# 將輸入文本中"shiyanlou" 全局替換爲"hehe",並只打印替換的那一行,注意這裏不能省略最後的"p"命令
$ sed -n 's/shiyanlou/hehe/gp' passwd
注意: 行內替換能夠結合正則表達式使用。
$ nl passwd | grep "shiyanlou"
# 刪除第21行
$ sed -n '21c\www.shiyanlou.com' passwd
看到上面的標題,你可能會感到驚異,難道咱們這裏要學習的是一門「語言」麼,確切的說,咱們是要在這裏學習awk
文本處理語言,只是咱們並不會在這裏學習到比較完整的關於awk
的內容,仍是由於前面的緣由,它太強大了,它的應用無處不在,咱們沒法在這裏以簡短的文字描述面面俱到,若是你有目標成爲一個linux系統管理員,確實想學好awk
,你一不用擔憂,實驗樓會在以後陸續上線linux系統管理員的學習路徑,裏面會有單獨的關於正則表達式
,awk
,sed
等相關課程,敬請期待吧。下面的內容,咱們就做爲一個關於awk
的入門體驗章節吧,其中會介紹一些awk
的經常使用操做。
AWK
是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一.其名稱得自於它的創始人Alfred Aho(阿爾佛雷德·艾侯)、Peter Jay Weinberger(彼得·溫伯格)和Brian Wilson Kernighan(布萊恩·柯林漢)姓氏的首個字母.AWK程序設計語言,三位建立者已將它正式定義爲「樣式掃描和處理語言」。它容許您建立簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其餘的功能。最簡單地說,AWK是一種用於處理文本的編程語言工具。
awk全部的操做都是基於pattern(模式)—action(動做)對來完成的,以下面的形式:
$ pattern {action}
你能夠看到就如同不少編程語言同樣,它將全部的動做操做用一對{}
花括號包圍起來。其中pattern一般是是表示用於匹配輸入的文本的「關係式」或「正則表達式」,action則是表示匹配後將執行的動做。在一個完整awk操做中,這二者能夠只有其中一個,若是沒有pattern則默認匹配輸入的所有文本,若是沒有action則默認爲打印匹配內容到屏幕。
awk
處理文本的方式,是將文本分割成一些「字段」,而後再對這些字段進行處理,默認狀況下,awk以空格做爲一個字段的分割符,不過這不是固定了,你能夠任意指定分隔符,下面將告訴你如何作到這一點。
awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]
其中-F
參數用於預先指定前面提到的字段分隔符(還有其餘指定字段的方式) ,-v
用於預先爲awk
程序指定變量,-f
參數用於指定awk
命令要執行的程序文件,或者在不加-f
參數的狀況下直接將程序語句放在這裏,最後爲awk
須要處理的文本輸入,且能夠同時輸入多個文本文件。如今咱們仍是直接來具體體驗一下吧。
介紹 Ubuntu 下軟件安裝的幾種方式,及 apt,dpkg 工具的使用。
一般 Linux 上的軟件安裝主要有三種方式:
這幾種安裝方式各有優劣,而大多數軟件包會採用多種方式發佈軟件,因此咱們經常須要所有掌握這幾種軟件安裝方式,以便適應各類環境。下面將介紹前三種安裝方式,從源碼編譯安裝你將在 Linux 程序設計中學習到。
試想一下,平時咱們在使用 Windows 的時候,想要安裝一個軟件,咱們須要在網上去下載對應軟件的安裝包,接着安裝的時候就是不斷的去點擊下一步,這些流程想必你們已經經歷的無數回了,可是在 Linux 下,一個命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。在學習這種安裝方式以前有一點須要說明的是,在不一樣的linux發行版上面在線安裝方式會有一些差別包括使用的命令及它們的包管理工具,由於咱們的開發環境是基於ubuntu的,因此這裏咱們涉及的在線安裝方式將只適用於ubuntu發行版,或其它基於ubuntu的發行版如國內的ubuntukylin(優麒麟),ubuntu又是基於debian的發行版,它使用的是debian的包管理工具dpkg,因此一些操做也適用與debian。而在其它一些採用其它包管理工具的發行版如redhat,centos,fedora等將不適用(redhat和centos使用rpm)。
apt-get
使用各用於處理apt
包的公用程序集,咱們能夠用它來在線安裝、卸載和升級軟件包等,下面列出一些apt-get
包含的經常使用的一些工具:
工具 |
說明 |
|
其後加上軟件包名,用於安裝一個軟件包 |
|
從軟件源鏡像服務器上下載/更新用於更新本地軟件源的軟件包列表 |
|
升級本地可更新的所有軟件包,但存在依賴問題時將不會升級,一般會在更新以前執行一次 |
|
解決依賴關係並升級(存在必定危險性) |
|
移除已安裝的軟件包,包括與被移除軟件包有依賴關係的軟件包,但不包含軟件包的配置文件 |
|
移除以前被其餘軟件包依賴,但如今再也不被使用的軟件包 |
|
與remove相同,但會徹底移除軟件包,包含其配置文件 |
|
移除下載到本地的已經安裝的軟件包,默認保存在/var/cache/apt/archives/ |
|
移除已安裝的軟件的舊版本軟件包 |
下面是一些apt-get
經常使用的參數:
參數 |
說明 |
|
自動迴應是否安裝軟件包的選項,在一些自動化安裝腳本中使用這個參數將十分有用 |
|
模擬安裝 |
|
靜默安裝方式,指定多個 |
|
修復損壞的依賴關係 |
|
只下載不安裝 |
|
從新安裝已經安裝但可能存在問題的軟件包 |
|
同時安裝APT給出的建議安裝的軟件包 |
關於安裝,如前面演示的同樣你只須要執行apt-get install <
軟件包名
>
便可,除了這一點,你還應該掌握的是如何從新安裝軟件包。 不少時候咱們須要從新安裝一個軟件包,好比你的系統被破壞,或者一些錯誤的配置致使軟件沒法正常工做。
你可使用以下方式從新安裝:
$ sudo apt-get --reinstall install w3m
另外一個你須要掌握的是,如何在不知道軟件包完整名的時候進行安裝。一般咱們是使用Tab
鍵補全軟件包名,後面會介紹更好的方法來搜索軟件包。有時候你須要同時安裝多個軟件包,你還可使用正則表達式匹配軟件包名進行批量安裝。
# 更新軟件源
$ sudo apt-get update
# 升級沒有依賴問題的軟件包
$ sudo apt-get upgrade
# 升級並解決依賴關係
$ sudo apt-get dist-upgrade
若是你如今以爲 w3m
這個軟件不合本身的胃口,或者是找到了更好的,你須要卸載它,那麼簡單!一樣是一個命令加回車 sudo apt-get remove w3m
,系統會有一個確認的操做,以後這個軟件便「滾蛋了」。
當本身剛知道了一個軟件,想下載使用,須要確認軟件倉庫裏面有沒有,就須要用到搜索功能了,命令以下:
sudo apt-cache search softname1 softname2 softname3……
dpkg 是 Debian 軟件包管理器的基礎,它被伊恩·默多克建立於 1993 年。dpkg 與 RPM 十分類似,一樣被用於安裝、卸載和供給和 .deb 軟件包相關的信息。
dpkg 自己是一個底層的工具。上層的工具,像是 APT,被用於從遠程獲取軟件包以及處理複雜的軟件包關係。"dpkg"是"Debian Package"的簡寫。
咱們常常能夠在網絡上簡單以deb
形式打包的軟件包,就須要使用dpkg
命令來安裝。
dpkg
經常使用參數介紹:
參數 |
說明 |
|
安裝指定deb包 |
|
後面加上目錄名,用於安裝該目錄下的全部deb安裝包 |
|
remove,移除某個已安裝的軟件包 |
|
顯示 |
|
顯示已安裝軟件的信息 |
|
搜索已安裝的軟件包 |
|
顯示已安裝軟件包的目錄信息 |
咱們先使用apt-get
加上-d
參數只下載不安裝,下載emacs編輯器的deb包,下載完成後,咱們能夠查看/var/cache/apt/archives/目錄下的內容,
而後咱們將第一個deb
拷貝到home目錄下,並使用dpkg
安裝
$ cp /var/cache/apt/archives/emacs24_24.3+1-4ubuntu1_amd64.deb ~
# 安裝以前參看deb包的信息
$ sudo dpkg -I emacs24_24.3+1-4ubuntu1_amd64.deb
如你所見,這個包還額外依賴了一些軟件包,這意味着,若是主機目前沒有這些被依賴的軟件包,直接使用dpkg安裝可能會存在一些問題,由於dpkg
並不能爲你解決依賴關係。
# 使用dpkg安裝
$ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb
若是你依然在糾結到底linux將軟件安裝到了什麼地方,那麼很幸運你將能夠經過dpkg
找到答案
使用dpkg -L
查看deb
包目錄信息
二進制包的安裝比較簡單,咱們須要作的只是將從網絡上下載的二進制包解壓後放到合適的目錄,而後將包含可執行的主程序文件的目錄添加進PATH
環境變量便可,若是你不知道該放到什麼位置,請從新複習第四節關於 Linux 目錄結構的內容。