系統信息:CentOS 64位。
-
一張圖了解命令提示符和命令行


-
一些實用小命令
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的第三章(文件系統中跳轉)
-
操作文件和目錄
copy: $ cp file1 file2 $cp -r dir1 dir2
move: $ mv file dir/
rename: $ mv file1 file2 $mv dir1 dir2 # 如果dir2 存在,則為移動操作
remove: $ rm file $rm -r dir
創建文件: $ touch a.txt $ >a.txt 查看文件: $ cat file
創建目錄: $mkdir dir 查看文件類型: $file a.txt
創建隱藏文件/目錄: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|sort|uniq|grep str(sort對每行字符串進行排序,uniq忽略重復行,grep打印匹配行。PS:uniq命令可以去除排序過的文件中的重復行,因此uniq經常和sort合用。換句話說,為了使uniq起作用,所有的重復行必須是相鄰的。)
-
用戶和文件權限
在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,依次執行命令:
$ 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
命令就是語句,語句就是命令
因為每一個命令都是合法的腳本語句,因此可以把多條語句直接羅列到腳本中,也可以將其包裹到一個函數中:
#!/usr/bin/env bash
say_hello()
{
echo "hello"
}
create_file()
{
touch a.txt
}
say_hello # 通過呼叫函數名來執行
create_file
此外,還有些元素是腳本語句的一部分:
if [ $# != 1 ] then echo "hello" fi
注意到,這里的[ $# != 1 ]其實也可以放到終端中去執行
$[ $# != 1 ] $ echo $? 0
查看返回指為0 表示命令執行成功。只要if 后面跟一個可以正確執行的命令,則結果為真;如果跟一個執行會出錯的命令,那么結果即為假。此外,由於命令對空格是敏感的,這就導致腳本語句對空格也是變態的敏感。
位置參數
執行下面的腳本: $ ./xpjiang.sh a.txt b.txt(執行前需要$ chmod +x xpjiang.sh):
#!/usr/bin/env bash echo " Number of arguments: $# The program name is: $0 The first argument is: $1 "
輸出如下:
Number of arguments: 2 The program name is: ./xpjiang.sh The first argument is: a.txt
這里的$0 代表命令名,$1 代表第一個參數,$2 代表第二個參數...,$# 表示該命令執行時的參數總個數。
腳本不再當前shell 中執行
每次啟動一個腳本,系統都會為當前shell 單獨開啟一個子shell,在子shell 中執行腳本中的語句。例如,腳本中導出一個環境變量:
#!/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,更改模式為可執行:
cd $1 echo I am in `pwd` # `pwd` 會取出該命令的輸出 for file in `ls` do mv $file $file.txt done
添加到 ~/bin 中,使其成為一個系統命令。執行:
$ 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 遠程登錄服務器的時候,需要先登錄再執行命令,實際中每次這樣操作很麻煩。可以在本地寫一個腳本,在服務器上執行腳本中相關的命令。
確認執行
讓程序在執行過程中暫停,報告一些信息,用戶根據程序提供的信息判斷是否允許程序繼續執行下面的操作,這就是確認執行。
#!/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.
最后:
轉載請注明出處.
以上.
