俗話說:工欲善其事,必先利其器。我們要學習Android和Linux相關知識,源碼的編譯環境自然是必不可少的了。中國人是用着Windows系統長大的,若想要編譯Android源碼可偏偏Google推薦的卻是Ubuntu或Mac OS系統,這可苦了剛準備入道的小白白們。可能有新朋友要問了,編一個源碼爲啥對系統還有要求啊?其實很簡單,編譯各種硬件平臺上實際可以運行的源碼,必然需要依賴一大堆諸如跨平臺交叉編譯工具之類的編譯相關工具套件,由於這些組件數量十分巨大,爲了能儘可能地統一大家的安裝步驟,以免遇到各種未知的編譯問題無從解決,所以Google甚至規範了Ubuntu的所需版本。Ubuntu的12.04、14.04、16.04我都有使用過,均可正常編譯源碼,雖然Google在其開發者官網中提供了各Unbuntu版本所對應的組件安裝流程說明,不過就我自己的使用感受來說Ubuntu 16.04的體驗是最棒的,首先它默認就集成了某些前些版本中所未來得及導入的組件,且其默認就集成好的各種gcc,g++,python等一系列工具的版本就已經達到編譯Android源碼的要求,所以它不僅用戶體驗更好,而且安裝編譯環境所需的步驟也最少,體驗甚棒!
這裏先提供幾個今後使用頻率可能較高的網站以供大家學習:
1:http://www.ubuntu.org.cn/download/alternative-downloads
Ubuntu官網的下載鏈接,大家可以到這裏選擇下載你想要安裝的Ubuntu系統版本。
2:https://source.android.com/source/
Google源碼開發者官網,這裏有各種源碼下載方法和系統環境配置步驟,該網站所講解的內容相對會更偏向底層一些。注意:目前Google只有提供Ubuntu和Mac系統的環境搭建步驟,該網站有時需要翻牆才能查看。
3:https://developer.android.com
Google的Android Apk開發官網,裏面有各種Demo,工具和Sdk提供,該網站所講解的內容更偏向Android App開發,是學習Android應用程序開發非常棒的手冊,裏面有各種教程,分着做你就可以很快入門app,可惜該網站有時也需要翻牆才能查看。
由於這篇文章的目的是帶大家儘快入門使用Linux下的一些常用命令,所以對於Android編譯環境搭建和Ubuntu系統安裝的相關知識在此就不再贅述了,有需要的朋友請自行學習。
對於剛開始學習Linux和Android的朋友,不知是否會樣產生這樣一個疑問:既然Ubuntu上已經有完善的用戶界面可供我們進行各種常規操作了,那爲何當在學習Android、Linux時,我們是否有必要花時間去學習這些奇奇怪怪的命令呢?當初剛開始接觸linux時筆者也一直有類似疑問,後來逐漸體會到,在Android和Linux的世界裏,爲了給手機/單片機這些硬件資源有限的設備儘可能地騰出寶貴的硬件資源給更重要的用戶體驗部分,所以Android一類的嵌入式系統,從一開始就會進行功能上的“閹割”,最後一半隻會保留最重要的部分命令接口進行交互。所以若想高效地控制手機底層行爲,我們只能通過adb接口通過執行一些linux命令來對設備實現控制。另外,下載源碼,編譯源碼、管理源碼等等一系列行爲只有通過linux的命令才能高效地實現,雖說Ubuntu和Mac OS中確實有一些帶UI的應用同樣可以幫助我們達成通過執行命令想要的結果,但不論從實際效率還是功能的豐富性、靈活性來說,這些UI工具都只是命令工具的一個子集,最終使得在日常學習工作中使用時讓人多少有些力不從心了
不論你使用的是MAC、Ubuntu或是某種基於Linux內核的操作系統,命令行工具(Terminal)幾乎無一例外的成爲程序員鎖定在任務欄的標配工具。由此可見命令行對於linux系統的體系的重要性。不過話說回來,雖然命令行中支援的命令數量十分巨大,實際在日常工作中我們經常會用到命令卻並不太多,一些諸如awk、sed之類的部分高級命令,對於初學者也並不是那麼必要,初學者一開始直接可以不用學習。命令行是一門實驗性科學,很多命令存在的意義是爲了能更大程度地提高我們工作效率,待今後遇到實際問題時再進行針對性學習即可,切不可死記硬背、強求數量,最後把自己的積極性給打消了,完全得不償失。
linux的命令儘管多種多樣,最重要的卻總是些和文件、目錄打交道的,學會了這些命令,linux下的日常源碼相關操作就已經足以順利進行了。
接觸Terminal,首先必須要了解terminal中開頭字串的意義:
deployer@iZ28v0x9rjtZ:~$
這是Ubuntu系統下命令行中,敲入每條命令前的固定字符。最前面是用戶名:"deployer",接着"@"符號後是電腦名:"iZ28v0x9rjtZ"(由於這個terminal運行在雲服務器上,所以電腦名會有點怪怪的),緊跟着的冒號後是"~"號,最後以一個"$"號結尾。
deployer@iZ28v0x9rjtZ:~$ cd Document/
deployer@iZ28v0x9rjtZ:~/Document$
我試着敲入了一條cd命令:”cd Document"(切換當前工作目錄到Document目錄),可以發現,以前的"~"號域變爲了"Document"。其實,這個冒號後面所接的部分是是當前命令行所在的工作路徑。也許你會覺得很奇怪,既然是路徑,那"~"號是什麼鬼?是路徑下的目錄名爲"~"麼?答案是否定的,”~"被linux系統用來指代當前用戶所在的Home路徑,可以理解爲"~"指代一個特殊的路徑,該路徑爲當前用戶的默認工作目錄。
接下來我們試着切回”~"目錄,看看該目錄究竟指代的是哪裏:
deployer@iZ28v0x9rjtZ:~/Document$ cd ~
deployer@iZ28v0x9rjtZ:~$ pwd
/home/deployer
我用了一條pwd命令(查看當前工作目錄的絕對路徑),可以看出,在Ubuntu系統中"~"指代的是"/home/deployer"路徑,所以在Ubuntu系統上,"cd ~"和"cd /home/deployer"是完全等價的啦~ 需要特別提醒一下,若該電腦有好幾個user賬戶,那麼在不同賬戶進入Ubuntu系統後,"cd ~"所指代的絕對路徑其實並不一樣,例如這臺電腦上有兩個用戶user1和user2,開機後,分別用user1和user2的賬戶登錄該電腦,同樣使用"cd ~"命令後,命令行所在的工作路徑卻並不一樣,一個是/home/user1,另一個則會是/home/user2。
最後我們來看看那個”$”是什麼意思。
deployer@iZ28v0x9rjtZ:~$ sudo su
[sudo] password for deployer:
root@iZ28v0x9rjtZ:/home/deployer#
敲入命令”sudo su”(將當前用戶修改爲root超級用戶,類似於Window上的Administrator賬戶)後,發現”$”編程了”#”,意思就是提醒你,現在你是root權限了,若操作不當可能會導致非常嚴重的危險。注意,root用戶是可以刪除任何文件的,甚至可以把操作系統都直接刪了,所以希望大家,尤其是初學者最好不要見到”#”號。
有了這些基礎知識,我們就可以正式開始筆者認爲最有必要的基礎命令學習過程了:
文件/夾處理
創建一個目錄,名爲dir:
mkdir dir
創建一個多層嵌套的文件夾:
mkdir -p dir1/dir2
改變當前的工作目錄到newdir:
cd newdir
cd .. (改變工作目錄到當前工作目錄的上級目錄)
cd - (改變工作目錄到使用cd命令前的目錄中,該命令特別適用於需臨時切換到其他目錄做一些操作然後快速回退回來的情況)
cd ~ (改變工作目錄到home目錄)
cd ~/test (改變工作目錄到home目錄下的test文件夾中)
打印當前工作目錄的絕對路徑:
pwd
將源文件拷貝爲目標文件:
cp source_file dest_file
同時拷貝多個文件到dir文件夾中:
cp file1 file2 dir
遍歷源文件夾中的所有文件並全部拷貝到目標文件夾中:
cp -r source_dir dest_dir
創建一個軟鏈接(類比windows系統中的快捷方式):
ln -s linked_file link
剪切源文件到目標地址,若源文件地址和目標地址相同,即爲更名作用(linux無更名命令):
mv source_file dest_file
刪除文件:
rm file1 file2
刪除空的文件夾
rmdir dir
刪除非空文件夾:
rm -rf dir
文件顯示
列出工作目錄中所有的”常規”文件(不包含以”.”開頭的文件,以”.”開頭的文件在linux中是隱藏文件):
ls
以更詳細的方式顯示所有”常規”文件(包含文件權限,文件大小等訊息):
ls -l
列出工作目錄中所有的文件(包含以”.”開頭的文件):
ls -a
以修改時間方式排序顯示文件:
ls -t
以文件大小方式排序顯示文件:
ls -S
文件內容顯示
顯示文件file1中的所有內容:
cat file1
顯示file1中的所有內容,不過會一頁一頁的顯示,不讓用戶錯過重要訊息:
less file1
顯示file文件的最初十行內容:
head -n 10 file
顯示file文件的最後十行內容:
tail -n 10 file
文件名模式匹配
顯示所有的“常規”文件:
ls *
顯示所有的隱藏文件(以”.”開頭的文件)
ls .*
顯示所有文件名以”.log”結尾的文件:
ls *.log
顯示所有文件名中包含”bug”字串的“常規”文件:
ls *bug*
顯示所有文件名中以”.”結尾且其後會緊跟一個單字符的“常規”文件(“?”指代此處必須有某個單字符character存在):
ls *.?
文件內容搜索
顯示file文件中所有包含”substring”字串的行內容:
grep substring file
顯示file文件中所有包含”substring”字串的行內容,但忽略substing的大小寫(Case insensitive mode ):
grep -i substring file
顯示file文件中所有不包含”substring”字串的行內容(反向過濾):
grep -v substring file
以遍歷的方式搜索dir文件夾中的所有文件,並顯示所有包含”substring”字串的行內容:
grep -r substring dir
修改文件訪問權限
在file文件中爲當前user添加可寫權限(user、write的首字符):
chmod u+w file
在file文件中爲當前group添加可讀權限(group、read):
chmod g+r file
在file文件中爲other user添加可執行權限(other user、execute):
chmod o+x file
在file文件中爲所有權限組均添加可讀寫權限(all=u+g+o):
chmod a+rw file
遍歷dir目錄中的所有文件,併爲其添加完全的可讀權限:
chmod -R a+r dir
比較文件和文件夾內容
比較file1和file2的差異:
diff file1 file2
比較file1和file2的差異(以圖形界面方式):
meld file1 file2
比較兩個文件夾中所有內容的差異:
diff -r dir1 dir2
文件查找
在當前路徑下查找所有文件名中帶有”log”字串的文件:
find . -name “*log*”
在當前路徑下查找所有文件名已”.pdf”結尾的文件,併爲每個搜索結果調用grep命令:
find . -name “*.pdf” -exec grep substring {} \;
在系統數據庫中快速查找帶有”pub”字串的文件(需要注意的是,系統數據庫默認情況下每天只更新一次,所有當天的即時修改不一定能搜到,若想即使查詢需調用updatedb命令來即使更新系統數據庫):
locate “*pub*”
輸出重定向
重定向ls命令的輸入內容到files文件中:
ls *.png > files
已內容追加的方式,重定向ls命令的輸入內容到files文件中(不會刪除上次的內容,僅是追加):
ls *.jpg >> files
通過管道(“|”)將前面命令的返回值傳給後面的命令:
cat *.log | grep error
進程控制
顯示所有運行中的進程訊息:
ps -aux
像windows任務管理器一樣,動態實時顯示系統資源情況(包含內存、cpu使用狀況和進程運行狀況等資訊):
top
想進程號爲pid的進程發送terminal信號,讓其主動結束運行:
kill <pid> (進程id號可以通過ps或top命令找到)
若上面的kill無效,則使用最強力的-9信號來結束進程:
kill -9 <pid>
殺死進程名爲process_name的進程:
pkill <process_name>
查看文件、分區大小
顯示當前目錄下的所有文件磁盤佔用情況:
du
統計file文件中的字符總數:
wc file
顯示當前文件路徑所在磁盤的使用情況:
df -h .
顯示系統所有磁盤的使用情況:
df -h
壓縮、解壓縮
使用gz/bz2,壓縮一個文件:
gzip file (.gz格式)
bzip2 file (.bz2格式,)
解壓縮一個文件:
gunzip file.gz
bunzip2 file.bz2
創建一個壓縮檔案包:
tar -zcvf archive.tar.gz dir/
tar -jcvf archive.tar.bz2 dir/
顯示壓縮檔案包中的內容:
tar -ztvf archive.tar.gz
tar -jtvf archive.tar.bz2
解壓壓縮檔案包:
tar -zxvf archive.tar.gz
tar -jxvf archive.tar.bz2
taroptions:
c:create
t:test
x:extract
j: on the fly bzip2 (un)compression
z: on the fly gzip (un)compression
使用 7-zip: (最大的壓縮率算法,代價是壓縮和解壓都會相對慢些)
7z a archive.7z <files> (創建)
7z l archive.7z (顯示)
7z x archive.7z (解壓)
使用zip:
zip r archive.zip <files> (創建)
unzip t archive.zip (顯示)
unzip archive.zip (解壓)
用戶管理
顯示登陸系統的用戶情況:
who
顯示自己的登陸用戶名:
whoami
顯示當前用戶所屬group:
groups user
切換到另一個用戶名爲my的用戶 :
su my
切換到超級用戶(不建議使用):
sudo su
時間管理
等待60s:
sleep 60
顯示當前時間:
date
每隔3s執行一下command,並刷新結果:
watch -n3 <command>
常用的系統管理命令
修改文件的用戶和用戶組所屬權限:
chown -R newuser:newgroup dir
五分鐘後重啓機器:
shutdown -r +5
立即關機:
shutdown -h now
顯示所有的網卡訊息:
ifconfig -a
爲eth0網卡分配ip地址:
ifconfig eth0 192.168.1.1
關閉網卡eth0:
ifconfig eth0 down
ping ip 地址:
ping192.168.1.1
查看kernel版本:
uname -a
以上就是一些十分重要且常用的linux命令,熟悉了這些命令,相信你也可以成爲別人眼中對着黑黑命令行噼裏啪啦敲字的高級“黑客”啦~
前面提到過,linux是個實驗性的技術,需要大家親自實踐,在命令行的不斷報錯中逐步熟悉才能最終掌握,不要怕錯,立馬裝上虛擬機實踐起來吧!!
One More Thing!咱也學學喬布斯來個最後一擊,分享一些十分有用的小知識:
1:使用“man”命令,man + <command>就可以很詳盡地顯示出輸入命令的所有參數和詳細用例,再也不必聯網百度了。記住:有問題找男人”man”.
2:你的助手tab鍵,當記不清命令的完整參數或想要cd的文件路徑時,雙擊tab鍵後系統會給出你貼心的自動補齊,若選項不止一個,系統也會給你列出所有的候選項。
3:”history”命令可以列出曾經敲入過得所有命令,你只需要複製粘貼或使用”!+命令序號”就能運行你的歷史命令了。
4:”sudo”命令,前面講到過,不到萬不得已,千萬不要使用”sudo su”命令切換到root用戶自執行代碼。不過有些時候普通用戶確實權限不夠啊,該怎麼辦呢?這時候就可以使用
“sudo + command”來以root用戶執行一次代碼了,這樣不必擔心切成root用戶忘了切回而坑導致的災難性後果。(試試”sudo ifconfig eth0
down”)
5:當某個命令執行卡住或想提前結束,除了使用kill命令外,可以試試使用組合鍵“ctrl+z”或“ctrl+x”,正常情況下這兩個命令會幫你提前結束進程。
6: ”ctrl+l”組合鍵可以幫你清除terminal中的所有內容,讓你清爽迎接下一個命令。
7: ”ctrl+u”組合鍵可以幫你快速清除光標前的所有命令。
8: ”ctrl+r”組合鍵是快速查找歷史命令的快捷鍵。
9:點擊鼠標中間可以將同個terminal中被選中的內容直接複製到光標所在處,十分好用。也可結合”ctrl+shift+c”和”ctrl+shift+v”在terminal中盡情馳騁。
linux命令千千萬,只希望這篇文章能拋磚引玉,讓大家對linux不在陌生。時間充足的朋友,建議你們去鳥哥的私房菜學習更多更詳細的linux知識http://cn.linux.vbird.org.
若有任何疑惑或建議,歡迎大家提出來一同討論學習~