九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
轉(zhuǎn)載自:
九十分鐘極速入門Linux——Linux Guide for Developments 學(xué)習(xí)筆記
http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=404510068&idx=2&sn=0fc406025644a60ae8a94f3ff0cba626&scene=23&srcid=0101ZDCyZGjWLS8ygofWkNSh#rd
-
一張圖了解命令提示符和命令行
-
一些實(shí)用小命令
mkdir(make directory,創(chuàng)建目錄)、ls(list,列出當(dāng)前目錄下的內(nèi)容)、rm(remove,刪除文件,如果刪除目錄,需要加參數(shù)-r,表示遞歸-recursive刪除)、man(manual,手冊(cè),后面跟命令打開該命令的使用手冊(cè),進(jìn)入后鍵入/- 參數(shù):查找參數(shù)如何使用,n查找下一處,q退出用戶手冊(cè))、ctrl+l(清屏)、pwd(print working dir,顯示工作路徑)、ctrl+a:到達(dá)命名行首
更多信息可參見書籍:The Linux Command Line的第二章和第六章(什么是shell、使用命令)
-
在文件系統(tǒng)中跳轉(zhuǎn)
cd(change directory)、.表示當(dāng)前目錄、./代表當(dāng)前目錄的子目錄、..表示當(dāng)前目錄的父目錄、cd /(通過絕對(duì)路徑的方式進(jìn)入根目錄)、cd -(回到原來的目錄)
Tips:cd 目錄名(和cd ./目錄名的作用相同) 可以通過Tab鍵補(bǔ)齊,如果有多個(gè)備選項(xiàng)的話,雙擊Tab列出所有匹配選項(xiàng)
更多參見書籍:The Linux Command Line的第三章(文件系統(tǒng)中跳轉(zhuǎn))
-
操作文件和目錄
創(chuàng)建隱藏文件/目錄:touch .文件名 或 mkdir .mydir,通過ls -a可以看到。
利用通配符刪除當(dāng)前目錄下的所有文件:rm -rf * 字符串匹配,列出/bin目錄下的所有包含"pin"字符串的文件: ls /bin|grep pin
下載imooc主頁:wget http://imooc.com
分頁查看文件內(nèi)容:less 文件名 (按住j向下滾屏 按住k向上滾屏 /字符:進(jìn)行字符查找,鍵入n查找下一處 雙擊g可以到達(dá)文件頭 點(diǎn)擊G可到達(dá)文件尾 q退出),man命令底層的分頁就是用的less,因此less中所有的快捷鍵在man中都是可以使用的。
放大/縮小/還原終端字體:ctrl + + ctrl + - ctrl + 0
輸入命令后不想執(zhí)行:ctrl+ c
解壓縮zip文件:unzip 文件名 壓縮成zip文件:zip -r 壓縮后文件名.zip 被壓縮的文件名
解壓縮*.tar.gz文件:tar zxvf 文件名 壓縮成tar文件:tar zcvf 壓縮后文件名.tar.gz 被壓縮文件名
解壓縮*.tar.bz2文件:tar jxvf 文件名 壓縮成tar文件:tar jcvf 壓縮后文件名.tar.gz 被壓縮文件名
-
重定向
輸出重定向(redirect stdout):>
將程序的輸出內(nèi)容保存到文件中:date >output.txt(注:date是一個(gè)系統(tǒng)自帶程序,輸出當(dāng)前時(shí)間)
cat file1 >file 表示將file1的內(nèi)容復(fù)制到file中 cat file1 >>file 表示將file1的內(nèi)容追加到file中 cat file1 file2 >file 表示將file1和file2連接到file中
標(biāo)準(zhǔn)錯(cuò)誤重定向(redirect stderr):2>
標(biāo)準(zhǔn)輸入重定向(redirect stdin):<
(PS:linux下有一個(gè)傳統(tǒng):Everything is a file,如目錄是一個(gè)目錄文件,各種設(shè)備都被抽象成了文件放到了目錄文件/dev下,系統(tǒng)上有三個(gè)非常特殊的文件,因?yàn)樗鼈兪且恢贝蜷_的,因此系統(tǒng)為他們分配了三個(gè)固定的file descriptor,文件描述符為0的文件叫做標(biāo)準(zhǔn)輸入文件(stdin),為1的叫做標(biāo)準(zhǔn)輸出文件(stdout),為2的叫做標(biāo)準(zhǔn)錯(cuò)誤輸出文件(stderr),因此你會(huì)看到標(biāo)準(zhǔn)錯(cuò)誤輸出重定向的標(biāo)識(shí)符為:2>)
一般情況下,標(biāo)準(zhǔn)輸入重定向的使用頻率不如管道,如:cat file1|uniq|grep str|sort(uniq忽略重復(fù)行,grep打印匹配行,sort對(duì)每行字符串進(jìn)行排序)
-
用戶和文件權(quán)限
在Linux中有這么一項(xiàng)傳統(tǒng):home is writable but not outside.
三種權(quán)限:用戶對(duì)文件主要有三種權(quán)限:r(reading)、w(writing)、x(executing)。
三種用戶類型:owner、group、world
對(duì)權(quán)限的討論就是看owner、group、world對(duì)文件的r/w/x權(quán)限。
如在終端中查看文件權(quán)限:$ ls - l a.txt,得到結(jié)果(注:查看目錄權(quán)限,ls -ld mydir):
-rw-rw-rw-. 1 xpjiang xpjiang 6 12月 23 21:31 a.txt
該行信息傳達(dá)的信息如下圖:
對(duì)文件的r 權(quán)限表示可以查看文件的內(nèi)容(cat file),對(duì)目錄的r 權(quán)限表示可以查看目錄的內(nèi)容(ls mydir);對(duì)文件的w 權(quán)限表示可以編輯該文件里的內(nèi)容,而對(duì)目錄的w 權(quán)限表示我們可以在該目錄下創(chuàng)建、刪除、重命名文件;對(duì)文件的x 權(quán)限表示可以把它作為一個(gè)程序來執(zhí)行,對(duì)目錄的x 權(quán)限表示我們可以進(jìn)入該目錄(cd mydir)。
對(duì)當(dāng)前目錄增加寫權(quán)限:chmod +w .
用vim編輯器創(chuàng)建一個(gè)腳本文件a.sh:vim a.sh(鍵入i進(jìn)入插入模式,寫入一個(gè)簡(jiǎn)單的打印命令:echo hello,esc退出插入模式,兩次大寫Z保存文件),執(zhí)行該腳本:./a.sh,一般情況下,我們沒有執(zhí)行權(quán)限,可以這樣做:chmod +x a.sh,執(zhí)行該腳本,終端輸出:hello。
chmod(change file mode):chmod 666 a.txt(666為file mode的八進(jìn)制表示)
-
進(jìn)程
獲取進(jìn)程號(hào)(PID,Process ID)
終端中啟動(dòng)vim,它會(huì)占據(jù)當(dāng)前的shell,敲Ctrl+Shift+T(編輯->鍵盤快捷鍵中可查看終端中使用的快捷鍵,也可根據(jù)需要自定義快捷鍵,例如Ctrl+Shift+C復(fù)制內(nèi)容,Ctrl+Shift+V粘貼)打開一個(gè)新的終端標(biāo)簽,ps aux 查看系統(tǒng)上所有的進(jìn)程情況,因?yàn)檩敵銎^長,我們可以在ps aux 后面加上管道符(|),用less 程序做分頁器:ps aux|less,輸出中的PID字段,就是我們關(guān)注的進(jìn)程號(hào)。鍵入 /vim 進(jìn)行查找,可以看到vim程序的進(jìn)程號(hào),不過更一般的查看進(jìn)程號(hào)的方式是用grep 命令查找vim關(guān)鍵字:ps aux|grep vim,使用kill vim進(jìn)程號(hào) 就可以結(jié)束vim程序(Ctrl+PgUp,切換到上一個(gè)終端標(biāo)簽可以看到vim程序已經(jīng)被殺死了)。
后臺(tái)執(zhí)行
在命令行中也可以啟動(dòng)圖形化程序,如firefox,Alt+Tab 可以切換回命令行,可以看到firefox占據(jù)了當(dāng)前的shell,如何處理這種情況呢?一個(gè)簡(jiǎn)單的方法是firefox &,這樣firefox就自動(dòng)在后臺(tái)執(zhí)行了,而且切換回終端后命令行依然可以使用。但是如果已經(jīng)出現(xiàn)了firefox占據(jù)了shell這種情況,可以Ctrl+z,發(fā)現(xiàn)firefox已經(jīng)沒有響應(yīng)了,切回終端,鍵入bg,這樣就跟firefox & 的情況一樣了,fg切換回前臺(tái),Ctrl+c 結(jié)束firefox(bg:把一個(gè)任務(wù)放到后臺(tái)執(zhí)行,fg:把一個(gè)任務(wù)放到前臺(tái)執(zhí)行)。
kill
kill 命令中常用的信號(hào)有2、9、15。其中2 表示中斷,實(shí)現(xiàn)和Ctrl+c 一樣的功能,由終端發(fā)送,通常它會(huì)終止一個(gè)程序;15 表示終止,是kill 命令發(fā)送的默認(rèn)信號(hào),如果程序仍然"活著",可以接受信號(hào)的話;9 表示殺死,這個(gè)信號(hào)很特別,鑒于進(jìn)程可能會(huì)選擇不同的方式,來處理發(fā)送給它的信號(hào),其中也包括忽略信號(hào),這樣9號(hào)信號(hào)并不發(fā)送給目標(biāo)進(jìn)程,而是內(nèi)核立即終止這個(gè)進(jìn)程。當(dāng)一個(gè)進(jìn)程以這種方式終止的時(shí)候,它沒用機(jī)會(huì)去做些"清理"工作,或者是保存勞動(dòng)成果。因?yàn)檫@個(gè)原因,可以把9號(hào)信號(hào)看作殺手锏(kill -9 進(jìn)程號(hào)),當(dāng)其他終止信號(hào)失敗后,再使用它。
除了通過kill終止進(jìn)程,很多程序也定義了自己的退出方式,比如shell就可以通過exit 命令退出,它等價(jià)于Ctrl+d。
這里順便說一下一種更糟糕的情況,一個(gè)異常的程序占用了大量的內(nèi)存,導(dǎo)致整個(gè)桌面系統(tǒng)卡頓了,使得我們無法在終端中輸入命令,此時(shí)怎么辦呢?Linux是同時(shí)運(yùn)行著七個(gè)工作臺(tái)的敲入Ctrl+Alt+F2到達(dá)其中一個(gè)工作臺(tái),在這里殺死那個(gè)進(jìn)程,Ctrl+Alt+F1回到原來運(yùn)行著圖形化界面的工作臺(tái)。
-
查找
文件和字符串搜索是一個(gè)開發(fā)者日常工作中頗為重要得一部分,下面就來看看shell中都有哪些命令供我們使用來實(shí)現(xiàn)自己的需求:
locate - 通過名字來在系統(tǒng)全局范圍內(nèi)查找文件
例:locate vimrc,locate命令還支持正則表達(dá)式:locate --regexp vim[a-z]rc
使用過程中,有時(shí)會(huì)發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,如首先touch aa.txt,然后locate aa.txt,發(fā)現(xiàn)終端中沒有輸出,通過man locate 了解到locate reads one or more databases prepared by updatedb,換句話說,locate 不是直接搜索整個(gè)文件系統(tǒng),而是從一個(gè)數(shù)據(jù)庫中讀數(shù)據(jù),這也就是為什么locate 跑的如此溜的原因,系統(tǒng)中的命令updatedb 會(huì)把系統(tǒng)中的數(shù)據(jù)存放到數(shù)據(jù)庫之中,但是updatedb 一般都是每天自動(dòng)運(yùn)行一次,因此我們剛剛創(chuàng)建的文件locate 是找不到的,解決辦法就是手動(dòng)運(yùn)行一下:sudo updatedb。
find - 在目錄層次結(jié)構(gòu)中搜索文件,支持很多參數(shù),經(jīng)常與字符串查找利器grep一起使用,用來處理搜索到的文件列表。
例:find . 列出當(dāng)前目錄下的所有目錄和文件,包括子目錄的文件和目錄。
find .|grep .txt,只列出名字包含.txt 目錄和文件
find . -type f,只列出文件。
find . -type f -exec ls -l '{}' ';',-exec 的結(jié)束符是 ';' ,兩者之間可以輸入任意的系統(tǒng)命令。'{}'代表我們前面找到的文件名。
echo hello >a.txt echo Hello >b.txt find . -type f -exec grep -n hell0 '{}' ';' -print,-print 打印出匹配項(xiàng)(包含字符串"hello")所在的文件,-n 打印出匹配項(xiàng)所在的行號(hào),如果想要忽略大小寫可以在grep 后跟參數(shù) -i,或者直接 -ni。
-
網(wǎng)絡(luò)操作
網(wǎng)絡(luò)操作主要涉及兩塊內(nèi)容:遠(yuǎn)程操作工具ssh和數(shù)據(jù)傳輸工具rsync。由于沒有可供操作的網(wǎng)絡(luò)主機(jī),因此這部分內(nèi)容暫且略過。更多信息可參見書籍:The Linux Command Line第十七章(網(wǎng)絡(luò)系統(tǒng))。
-
軟件安裝
在CentOS上安裝軟件主要有三種方式:
手動(dòng)下載編譯好的軟件或者源碼進(jìn)行安裝
下載rpm 包安裝(類似于ubuntu系統(tǒng)安裝deb包)
從官方倉庫,用yum 下載安裝(類似于從ubuntu官網(wǎng),用apt-get下載安裝)
手動(dòng)下載編譯好的軟件(可執(zhí)行程序)安裝實(shí)例:
從網(wǎng)址 http://sublimetext.com/,下載sublimeText編輯器。使用 tar jxvf Sublime\ Text\ 2.0.2.tar.bz2 解壓縮,但是執(zhí)行程序必須要用全路徑來執(zhí)行壓縮包中的sublime_text,如果想方便使用,把它變成一個(gè)系統(tǒng)命令,需要把整個(gè)解壓縮包中的子文件移動(dòng)到$ PATH 包含的一個(gè)目錄中(使用命令echo $ PATH查看),或者也可以不移動(dòng),方法就是搞一個(gè)符號(hào)鏈接:$ ln -s Sublime\ Text\ 2.0.2/sublime_text ~/bin/subl,如此在終端中直接輸入subl 即可開啟sublimeText編輯器。
手動(dòng)下載源碼安裝實(shí)例:
首先從網(wǎng)址 http://ftp.gnu.org/gnu/hello/,下載 hello-2.2.tar.bz2,依次執(zhí)行命令:
| 1 2 3 4 5 | $?tar?jxvf hello-2.2.tar.bz2 $?cd?hello-2.2 $ ./configure $?make $?sudo?make?install |
終端中執(zhí)行$ hello,輸出:hello, world!。這里./configure 的作用就是檢查當(dāng)前環(huán)境是否滿足安裝該軟件的依賴關(guān)系,make 是用來從Makefile中讀取指令進(jìn)行編譯的,而make install 是用來從Makefile中讀取指令,將軟件安裝到指定位置的。
安裝rpm 包:rpm -i rpm包
使用yum 在線下載安裝:以安裝git 為例:執(zhí)行命令$ sudo yum install git,git 軟件的rpm 包就被下載到本地硬盤,同時(shí)yum 命令包裹了rpm 命令,因此直接把安裝配置過程也給完成了,也就是一個(gè) yum install git 命令,git 就可以直接使用了,如果想卸載git,只需執(zhí)行 $ sudo yum remove git即可。-
shell 腳本編程
把許多命令集中到一個(gè)文件中作為一個(gè)腳本來執(zhí)行,就是所謂的shell 腳本編程。
關(guān)于shell 腳本編程我們劃分成以下幾個(gè)部分一一闡述:
指定解析器
可以通過bash、ruby 或python 這樣的語言來寫腳本,只要在腳本的首行指定用什么語法來進(jìn)行解析即可(bash 的語法很機(jī)器化,很多細(xì)節(jié)也比較晦澀,因此可以用ruby 這種更加人性化的語言來寫腳本)。如:
#!/usr/bin/env bash 或 #!/usr/bin/env ruby 或 #!/usr/bin/env python
命令就是語句,語句就是命令
因?yàn)槊恳粋€(gè)命令都是合法的腳本語句,因此可以把多條語句直接羅列到腳本中,也可以將其包裹到一個(gè)函數(shù)中:
| 1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/env bash say_hello() { echo?"hello" } create_file() { touch?a.txt } say_hello?# 通過呼叫函數(shù)名來執(zhí)行 create_file |
此外,還有些元素是腳本語句的一部分:
| 1 2 3 4 | if?[ $# != 1 ] then ?echo?"hello" fi |
| 1 2 3 | $[ $# != 1 ] $?echo?$? 0 |
位置參數(shù)
執(zhí)行下面的腳本: $ ./xpjiang.sh a.txt b.txt(執(zhí)行前需要$ chmod +x xpjiang.sh):
| 1 2 3 4 5 6 | #!/usr/bin/env bash echo?" Number of arguments: $# The program name is: $0 The first argument is: $1 " |
輸出如下:
| 1 2 3 | Number of arguments: 2 The program name is: ./xpjiang.sh The first argument is: a.txt |
這里的$0 代表命令名,$1 代表第一個(gè)參數(shù),$2 代表第二個(gè)參數(shù)...,$# 表示該命令執(zhí)行時(shí)的參數(shù)總個(gè)數(shù)。
腳本不再當(dāng)前shell 中執(zhí)行
每次啟動(dòng)一個(gè)腳本,系統(tǒng)都會(huì)為當(dāng)前shell 單獨(dú)開啟一個(gè)子shell,在子shell 中執(zhí)行腳本中的語句。例如,腳本中導(dǎo)出一個(gè)環(huán)境變量:
| 1 2 3 4 | #!/usr/bin/env bash export?Direct="/home/xpjiang/mydir/" cd?$Direct touch?hello.txt |
執(zhí)行$ ./xpjiang.sh 會(huì)發(fā)現(xiàn),當(dāng)前shell 中echo $Direct 得到的輸出為空并且當(dāng)前shell 中的工作目錄也沒有改變,這就說明腳本不在當(dāng)前shell 中執(zhí)行。如果需要腳本在當(dāng)前shell 中執(zhí)行,則執(zhí)行 $ source xpjiang.sh,可以發(fā)現(xiàn)目錄切換到了mydir 下,同時(shí)echo $Direct 的輸出為/home/xpjiang/mydir。
循環(huán)控制
編寫腳本rename.sh,更改模式為可執(zhí)行:
| 1 2 3 4 5 6 | cd?$1 echo?I am?in?`pwd`?# `pwd` 會(huì)取出該命令的輸出 for?file?in?`ls` do ?mv?$file?$file.txt done |
添加到 ~/bin 中,使其成為一個(gè)系統(tǒng)命令。執(zhí)行:
| 1 2 3 4 5 | $?mkdir?mydir $?cd?mydir;?touch?a b c;?cd?.. $ rename.sh mydir I am?in?/home/xpjiang/Desktop/mydir $?ls?mydir a.txt b.txt c.txt |
遠(yuǎn)程控制
SSH 遠(yuǎn)程登錄服務(wù)器的時(shí)候,需要先登錄再執(zhí)行命令,實(shí)際中每次這樣操作很麻煩。可以在本地寫一個(gè)腳本,在服務(wù)器上執(zhí)行腳本中相關(guān)的命令。
確認(rèn)執(zhí)行
讓程序在執(zhí)行過程中暫停,報(bào)告一些信息,用戶根據(jù)程序提供的信息判斷是否允許程序繼續(xù)執(zhí)行下面的操作,這就是確認(rèn)執(zhí)行。
| 1 2 3 4 5 6 7 8 9 | #!/usr/bin/env bash echo?-n?"Do you want to say hello? (y/n): " read?AAA if?[?"${AAA:-y}"?=?"y"?];?then echo?hello else echo?Nothing?done, bye. fi |
Reference: MOOC_Liunx Guide for Developments.
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的九十分钟极速入门Linux——Linux Guide for Developments 学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷积神经网络初探 | 数据科学家联盟 h
- 下一篇: OpenCV学习笔记大集锦