俗话说:工欲善其事,必先利其器。我们要学习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
若上面的kill无效,则使用最强力的-9信号来结束进程:
kill -9
杀死进程名为process_name的进程:
pkill
显示当前目录下的所有文件磁盘占用情况:
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
7z l archive.7z (显示)
7z x archive.7z (解压)
使用zip:
zip r archive.zip
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
修改文件的用户和用户组所属权限:
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 +
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.
若有任何疑惑或建议,欢迎大家提出来一同讨论学习~