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