天天看點

别出心裁的Linux指令學習法

别出心裁的Linux指令學習法

作業系統作業系統為你完成所有“硬體相關、應用無關”的工作,以給你友善、效率、安全。作業系統的功能我總結為兩點:管家婆和服務生:

  • 管家婆:通過程序、虛拟記憶體和檔案三個重要抽象管理計算機的CPU、記憶體、I/O裝置。
  • 服務生:為使用者提供shell,為程式員提供系統調用。

大家都比較熟悉Windows作業系統,Linux也是一種作業系統。Linux的架構如下圖:

别出心裁的Linux指令學習法

如果使用GUI,Linux系統和Windows作業系統的使用沒有什麼大的差別,用滑鼠可以解決大部分問題。

Linux學習應用的一個特點是通過指令行進行使用。學習使用Linux,實驗樓推薦的學習路徑如下:

别出心裁的Linux指令學習法

指令行的好處主要是可以批處理并自動化,還有些功能GUI無法完成,大家可以慢慢學習體會。

那麼多指令先學什麼,後學什麼是一個大問題,本文期望找一種方式,通過解決“Where”的問題,通過幾個核心指令的學習,讓你可以舉一反三通過實踐學習其他指令,進而解決Linux指令的“what”問題。

我們使用的Linux發行版是Ubuntu,使用Ubuntu有幾個快捷鍵要掌握一下,可以提高使用指令行的效率:

  • CTRL+ALT+T

    :打開終端,天天使用終端,用滑鼠打開太低效了;
  • CTRL+SHIFT+T

    :建立标簽頁,程式設計時有重要應用;
  • ALT+數字N

    :終端中切換到第N個标簽頁,程式設計時有重要應用;
  • Tab

    :終端中指令補全,當輸入某個指令的開頭的一部分後,按下

    Tab

    鍵就可以得到提示或者幫助完成;
  • 上下鍵盤

    :切換指令曆史,剛輸入一個很長的指令,按

    鍵就可以恢複;
  • CTRL+C

    :中斷程式運作。

1 Linux指令

登入Linux後,我們就可以在#或$符後面去輸入指令,有的時候指令後面還會跟着

選項

(options)或

參數

(arguments)。即Linux中指令格式為:

command [options] [arguments] //中括号代表是可選的,即有些指令不需要選項也不需要參數
           

其中

選項(option)

是調整指令執行行為的開關,

選項

不同決定了指令的顯示結果不同,

參數(arugment)

是指指令的作用對象。

如ls指令,

ls

ls .

是兩條等價的指令,顯示是目前目錄的内容,這裡“.”就是參數,表示目前目錄,這個參數預設可以省略。我們可以用

ls -a .

顯示目前目錄中的所有内容,包括隐藏檔案和目錄。其中“-a” 就是選項,改變了顯示的方式,如下圖所示:

别出心裁的Linux指令學習法

以上簡要說明了Linux指令以及選項和參數的差別,但具體Linux中哪條指令有哪些選項及參數,以及如何使用,需要我們靠經驗積累或者檢視Linux的幫助文檔了。

2 man指令

不論學習程式設計還是Linux指令,掌握幫助文檔的使用都是很重要的,是舉一反三的重要途徑。

man

是manual的縮寫,我們可以通過man man來檢視

man

的幫助,如下圖:

别出心裁的Linux指令學習法
别出心裁的Linux指令學習法

幫助文檔包含:

1 Executable programs or shell commands(使用者指令幫助) 
    2 System calls (系統調用幫助)  
    3 Library calls (庫函數調用幫助)  
    4 Special files (usually found in /dev)  
    5 File formats and conventions eg /etc/passwd(配置檔案幫助)  
    6 Games  
    7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)  
    8 System administration commands (usually only for root)  
    9 Kernel routines [Non standard]  
           

解釋一下:

1是普通的Linux指令  
2是系統調用,作業系統的提供的服務接口 
3是庫函數,  C語言中的函數
5是指檔案的格式,比如passwd, 就會說明這個檔案中各個字段的含義  
6是給遊戲留的,由各個遊戲自己定義  
7是附件還有一些變量,比如向environ這種全局變量在這裡就有說明  
8是系統管理用的指令,這些指令隻能由root使用,如ifconfig 

           

其中1,2,3是初學時學習的重點,差別大家練習一下就知道了,比如printf是C語言的庫函數,也是一個Linux指令,大家嘗試一下

man printf

,

man 1 printf

man 3 printf

,體會一下差別。

知道printf 指令也好,printf函數也好,查找幫助文檔都很容易。

man

有一個

-k

選項用起來非常好,這個選項讓你學習指令,程式設計時有了一個搜尋引擎,可以舉一反三。

我們通過一個例子來說明,比如資料結構中學過排序(sort),我不知道C語言中有沒有完成這個功能的函數,可以通過“man -k sort”來搜尋,因為是找C庫函數,我們關注帶3的,qsort好像是個好選項,如下圖:

别出心裁的Linux指令學習法

結合後面學習的grep 指令和管道,可以多關鍵字查找:

man -k key1 | grep key2 | grep key3 | ...
           

例如使用

man -k sort | grep 3

,可以更好的找到qsort,你可以試試。

man -k

有個等價的指令

apropos

,大家可以學習一下。

使用

man -k

找到指令後,可以用

man -f cmd

檢視指令的基本功能。

man -f

等價于

whatis

.

3 cheat 指令

man 雖然很重要,但有些指令看了幫助還不會用,初學者需要例子,cheat就是這個身邊的小抄。

cheat 指令不是Linux自帶的,大家參考這篇文章(英文版)安裝,實驗樓課程實驗系統中已經安裝了。Ubuntu中已經預設安裝好了python,cheat安裝過程如下:

sudo apt-get install python-pip git
sudo pip install docopt pygments
git clone https://github.com/chrisallenlane/cheat.git
cd cheat
sudo python setup.py install

           

cheat是作弊,小抄的意思。

cheat指令是在GNU通用公共許可證下,為Linux指令行使用者發行的互動式備忘單應用程式。它提供顯示Linux指令使用案例,包括該指令所有的選項和簡短但尚可了解的功能。比如強大的

find

指令,初學者看完幫助文檔後可能還是一頭霧水,那麼我們

cheat find

一下:

\*To find files by case-insensitive extension (ex: .jpg, .JPG, .jpG):

find . -iname "*.jpg"

\# To find directories:

find . -type d

\# To find files:

find . -type f

\# To find files by octal permission:

find . -type f -perm 777

\# To find files with setuid bit set:

find . -xdev \( -perm -4000 \) -type f -print0 | xargs -0 ls -l

\# To find files with extension '.txt' and remove them:

find ./path/ -name '*.txt' -exec rm '{}' \;

\# To find files with extension '.txt' and look for a string into them:

find ./path/ -name '*.txt' | xargs grep 'string'

\# To find files with size bigger than 5 Mb and sort them by size:

find . -size +5M -type f -print0 | xargs -0 ls -Ssh | sort -z

\# To find files bigger thank 2 MB and list them:

find . -type f -size +20000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

\# To find files modified more than 7 days ago and list file information

find . -type f -mtime +7d -ls

\# To find symlinks owned by a user and list file information

find . -type l --user=username -ls

\# To search for and delete empty directories

find . -type d -empty -exec rmdir {} \;

\# To search for directories named build at a max depth of 2 directories

find . -maxdepth 2 -name build -type d

\# To search all files who are not in .git directory

find . ! -iwholename '*.git*' -type f

\# Find all files that have the same node (hard link) as MY_FILE_HERE

find . -type f -samefile MY_FILE_HERE 2>/dev/null

           

通過實踐結合man指令把上面的例子了解了,

find

基本上就用的很不錯了。

使用cheat指令作弊是可以的。:)

4 其他核心指令

和查找相關的核心指令還有

find

locate

grep

whereis

which

等,其中:

  • find查找一個檔案在系統中的什麼位置,locate是神速版本的find(Windows下有個神器Everything和locate功能類似)。可以通過

    cheat find

    學習

    find

    指令。
  • grep 可以對檔案全文檢索,比如你接手一個C語言項目,裡面有上百個C源檔案,想找找main函數在那個檔案中,你可以通過

    grep -n main *.c

    ,快速找到main在哪個C檔案中并指出在第幾行。grep支援正規表達式,正規表達式也是一個重要的元知識。可以通過

    cheat grep

    grep

    指令。上面還提到,
  • whereis,which告訴你使用的指令工具裝在什麼地方。Linxu初學者會不習慣Linux的檔案系統,C槽呢?D盤呢?用

    apt-get install

    安裝程式好象也不用我們選擇安裝位置,程式裝在哪了?比如:我們在Linux下上網使用firefox浏覽器,大家可以使用

    whereis firefox

    或更精确的使用

    which firefox

    來看看結果。
  • apt-cache可以在使用apt-get install安裝一個程式時先找找軟體源的庫裡有沒有這個程式,有才可以安裝。比如老師推薦了一個調試工具

    ddd

    ,你可以用

    apt-cache search ddd

    查查有沒有這個程式。

5 終端“每日提示”學習

主動學習是學習方法中非常重要的一點,我們可以“問題驅動”,遇到問題用"man -k key"搜尋相關Linux指令,然後用"man cmd" 檢視幫助文檔結合“chea cmd”來學習,開始學習時我們也可以每次打開終端就學習一個Linux指令,這樣日積月累,就能更好的掌握Linux指令了。

我們可以讓終端自動給我們個每日提示,讓我們的學習自動化:

更娛樂化一點,我們先安裝cowsay。在Ubuntu下安裝cowsay:

sudo apt-get install cowsay
           

安裝cowsay後,在.bashrc中增加下面一行:

cowsay -f $(ls /usr/share/cowsay/cows | shuf -n 1 | cut -d. -f1) $(whatis $(ls /bin) 2> /dev/null | shuf -n 1)
           

每次打開終端,就會出現類似的界面,你就可以了解一個Linux指令了:

别出心裁的Linux指令學習法

6 小結

上面的指令包括man -k有一個共同特點就是基于“搜尋”解決了學習方法問題,這些指令學好用熟後可以舉一反三,大家重點學習,掌握了他們,其他指令就可以自學了。特别是man(man -k)和cheat對Linux指令學習非常重要。

我們課程涉及到的Linux指令在下面列出了,使用上面的搜尋指令通過實踐學習吧:

ac,apt-get,apt-cache
bzip2,
cat,cd,chgrp,chmod,chown,clear,compress,cp,
dd,ddd,df,diff,du,dump,
env,
find,finger,free,
gcc,gdb,grep,gzip,
head,
kill,
less,ln,locate,l,ls,
make,man,mkdir,more,mount,mt,mv,
netstat,nslookup,
od,objdump
passwd,patch,ps,pstop,pwd,
rm,rmdir
shell,sort,ssh,stty,
tail,tar,telnet,touch,tree,
umask,uname,unzip,
vi,vim,
whereis,which,who,write
...
           

指令行的藝術(The Art of Command Line) 給出了一個由淺入深的學習路徑。

學習Linux指令,Linux指令大全是個很好參考,集合了man和cheat的功能,查閱起來很友善。

更多Linux指令的學習也可以參考這裡(英文)還有這裡(中文),以及O'Reilly Linux、The Linux Cookbook和LinuxCommand。

除了這些文檔,當遇到不懂的指令時,也可以到Explain Shell,讓它給解釋一下。

如果自己沒有Linux環境,結合上面講的搜尋指令,可以去實驗樓學習《Linux 基礎入門(新版)》課程實踐練習。

參考資料

  1. Linux指令速查手冊 (電子版,Linux Phrasebook)
  2. Unix/Linux程式設計實踐教程
  3. 作業系統教程
  4. Linux系統架構
  5. 打造高效的工作環境 – Shell 篇
  6. 自學Linux指令的四種方法

歡迎關注“rocedu”微信公衆号(手機上長按二維碼)

做中教,做中學,實踐中共同進步!

  • 原文位址:http://www.cnblogs.com/rocedu/p/4902411.html
  • 推薦網站:部落格園、新浪微網誌、扇貝背單詞、DKY背單詞小組、有道雲筆記、豆瓣讀書
  • 版權聲明:自由轉載-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0

如果你覺得本文對你有幫助,請點一下左下角的“好文要頂”和“收藏該文”