前言
Linux我们在生活中直接接触的不多,但是应用到的地方倒是蛮多的。与windows不同,windows系统的使用直接图形界面操作即可,就算没有计算机操作经验的人接触几天都能够轻松使用了,但是Linux却不然,这个系统虽然提供了图形界面,但是却不如windows那么灵活,使用Linux操作系统来工作的人基本都是使用的命令行的方式直接与计算机交互,因此Linux操作系统是提供给专业人士使用的。学会Linux可以做很多事情,比如嵌入式开发、服务器端开发等,可以做的事太多了,现在就算想搞大数据你也必须先过Linux这一关,因为像Hadoop这些东西都是需要有Linux相关知识才能驾驭的,可以这么说,学编程的都要学Linux,因此这个东西你早晚都得看。
Linux系统与发行版本
Linux操作系统我们都听过,但是实际使用的时候我们使用的并不是直接叫做Linux,在官网下载的时候我们通常都会去搜Ubuntu、RedHat、CentOS这些,那么这些跟Linux到底有什么关系?其实这些东西都是Linux的发行版本,他们都以Linux作为内核,但是光有内核并不足以构成一个完整的操作系统,内核虽作为系统的重要组成,但是我们仍需要有程序去驱动它。简单地说:Linux内核 + 特定程序 = Linux操作系统,为什么要加特定两个字?那是因为Android系统也是以Linux作为内核的,然而他加了程序之后却不同于一般的Linux系统。至于这些发行版本不同其实是区别在应用程序上,不同发行版本各自认为某些程序重要就加到系统中,因此也就构成了不同的系统。目前用的最多的还是RedHat,尤其是企业开发,个人开发倒是没有什么不同,企业开发它能够给企业提供一些更优质的定制服务等。
搞双系统还是装个虚拟机?
我个人的建议是装虚拟机,因为你装双系统如果装失败了,又由于这个是系统的东西,可能影响你windows的正常使用,最终使得你不得不去重装windows就麻烦了,如果在学校那就更不用说。再者,如果你使用双系统,那么当你在Linux系统下做某些操作的时候如果遇到了某些问题或者错误,除非你有其他可以上网的设备,否则你得退出Linux转换成windows来查问题所在,是不是很麻烦呢?这些问题如果你装虚拟机就统统解决了,虚拟机可以使用VMWare和VirtualBox,但是现在VMWare用的比较多。装好虚拟机和操作系统后就直接在虚拟机中开机,你会发现使用虚拟机和我们装双系统是基本没有任何区别的。
下载与安装
这个就不多说啦,网上那么多教程,随便找一些比较新的教程照着操作马上就搞定啦。
Linux常用命令(以下的命令只是列出了常用的一部分,详细的可以通过man手册去查相关命令)
(1) man 1 xxx:查询man手册,数字1表示查询的是Linux命令,xxx表示具体的命令,如:man 1 ls;
man 2 xxx:查询api,xxx表示具体命令,如:man 2 ls;
man 3 xxx:查询C库函数,xxx表示具体的库;
(2)ls(list):列出当前目录下的目录/文件(直接可见的文件);
ls -a:列出当前目录下的目录/文件(包括隐藏文件,隐藏文件:Linux中文件名称以 .开头的均为隐藏文件);
ls -l:列出当前目录下的目录/文件的详细信息;
通过ls -l我们可以看到文件或目录的详细信息,这里讲讲权限的问题。drwxr- -rw-可以看到这里面共有10个字符,第一个字符表示文件的类型其中d:表示目录;- :表示普通文件;l:表示符号链接文件。接下来每3个字符归为1组,第一组是文件所有者的权限,第二组是文件所有者所在组的权限,第三组是其他用户的权限;r表示拥有读的权限,w表示拥有写的权限,x表示拥有执行权限,-表示没有权限,rwx的位置是固定的,因此有没有权限是一目了然;
ls -a -l:列出当前目录下的目录/文件(含隐藏文件)及其详细信息,无需特别记住,下同;
ls -l -a:等价于ls -a -l;
ls -al:等价于ls -a -l;
ls -la:等价于ls -a -l;
从这里可以看到,一个命令后面所带的参数是没有任何关联的,谁先谁后结果都一样,至于命令参数这么多样完全是系统开发者定义的,没有任何道理可言,只是提供了多种操作方式罢了;
(3)cd(change directory):切换目录;
cd .:参数是一个点,表示从当前目录切换到当前目录,例:cd ./abc表示进入从当前目录进入当前目录下的abc目录;
cd ..:参数是两个点,表示从当前目录切换到上一层目录,如果需要连续返回上一级目录则../../这类操作;
cd /abc/abc.txt:参数是以“/”开头的,表示切换根目录下的abc目录,参数代表一个绝对路径;
cd abc/abc.txt:参数不以“/”开头,表示从当前目录切换同一层目录下的abc目录,参数代表一个相对路径;
绝对路径:在windows中如果路径中以盘符(如:C:)开头则该路径代表绝对路径;在Linux中如果路径以字符"/"开头则表示从根 目录开始,代表绝对路径;
相对路径:在windows中如果路径中不以盘符(如:C:)开头则该路径代表相对路径;在Linux中如果路径不以字符"/"开头则表示 从当前目录开始,代表相对路径;
(4)pwd(print work directory):打印当前目录的绝对路径;
(5)mkdir(make directory):创建文件夹,例:mkdir test,一次只能创建一级目录;
mkdir -p test/abc/def:级联创建文件夹,即一次可以同时创建多级目录;
或许你会发现由于权限问题你创建不了目录了(包括其他操作可能也存在权限问题),那是因为你现在是普通用户,普通用户的权限被限制了,你可以选择切换成权限最高的root用户,方法如下:在命令行中键入sudo -s,然后输入一遍密码即可,之前填写用户信息你填过了的那个密码就是。输入密码你会发现并没有显示任何字符,不用怀疑,你确实输入了,直接按回车就切换成root用户了。
(6)mv(move):移动文件或者修改文件名;
mv /test/abc/a.txt /test/a.txt:第一个参数表示源路径,第二个参数表示目标路径,如果文件名相同则代表移动文件位置;
mv abc.txt nba.txt:这个还是与上一条语句说的一样,参数是一样的意思,只不过路径改变了而已,这条语句说的是从当前目录的abc.txt到nba.txt,很明显就是修改了文件的名称呗,要知道文件名也是路径的一部分;
(7)touch:创建空文件,例:touch abc.txt;
(8)cp(copy):复制文件或文件夹;
cp abc.txt nba.txt:用来复制普通的文件。第一个参数表示被复制的文件,第二个参数表示复制后黏贴生成的一模一样的文件,只不过改了名字而已。
cp -r test abc:用来复制文件夹。第一个参数表示被复制的目录,第二个参数表示复制后黏贴生成的一模一样的目录,只不过改了名字而已。并且被复制的目录下的所有内容也将被一并复制。
cp -f abc.txt nba.txt:表示强制复制文件,一般用这个指令复制文件,防止复制失败,因为复制失败是不会有提示的,下同。
cp -rf abc nba:表示强制复制文件夹。
你可能会发现mv的操作和cp的操作貌似差不多,都是把指定路径下的文件或目录搞成在目标路径也有一份,但是他们却有极大的区别,mv是移动,移动过后源路径就找不到这个文件或目录了;而cp是复制,复制一遍之后在源路径一样还有这个被复制的对象。简单理解为mv是剪切,cp是复制黏贴。
(9)rm(remove):删除文件/文件夹;
rm abc.txt:删除指定路径下的文件;
rm -r abc:删除指定路径下的目录;
rm -f abc.txt:强制删除abc.txt文件,当你这个文件被打开的时候仍然会被删除。原理:我们打开一个文件,这个文件是从硬盘被读到内存中,之后我们操作的都是读到内存中的数据,与硬盘文件无关,这时候你删除了硬盘中的abc.txt也不会有问题。如果你在打开文件后更新了数据,那么当文件被保存的时候将会把数据覆盖到硬盘文件中,从而就相当于直接操作了abc.txt文件。
rm -rf abc:强制删除abc目录(不管你里面有没有其他文件或文件夹);
(10)rmdir(remove directory):删除文件夹;
rmdir abc:删除空目录,如果目录中有文件则删不掉,必须使用rm -rf abc来强制删除;
(11)cat:在当前命令行下直接查看文件中的内容;
cat a.txt:查看a.txt文件中的内容;
(12)vi:直接打开文件并看到文件中的内容;
vi a.txt:把a.txt文件打开并看到里面的内容;
(13)ln(link):链接文件;
这里先说说windows下的快捷方式:windows桌面上的一些软件图标基本都是快捷方式,这个快捷方式与真正的应用程序其实是两个文件,这两个都占硬盘空间。但是快捷方式是链接到应用程序的,当你打开快捷方式,系统就会链接到对应的应用程序去启动。这就相当于有2本书,一本是目录,一本是书的正文。
Linux下的快捷方式(Linux中并没有快捷方式,只是效果相同这么称呼罢了,因为大家都是windows过来的,这么说比较好理解):软连接(符号链接):效果相当于windows中的快捷方式,但不是一回事。好比说鸟有翅膀会飞,你买了一张机票你也能飞了,虽然效果相同,但这并不是一回事。
ln -s abc.txt a.txt:参数abc.txt表示目标文件,a.txt是符号链接文件,直白地说就是目标文件的快捷方式。
下图中红框中d开头表示是一个目录,-表示是一个文件,l表示是一个链接。
硬连接:相当于备份,如果一份文件执行了硬连接指令,那么相当需备份了一份相同的文件,但是硬盘空间中并不会多占用内存。可以理解为虚拟备份,如果你把源文件删除了,那么这个备份文件将会代替源来的主文件成为当前的主文件。也就是说他相当于免死金牌,只要存在一个硬连接就相当于源文件多一条命,删除了一个文件,硬连接将会代替掉源文件,相当于你原来的文件仍然存在与内存中。
ln abc.txt a.txt:参数abc.txt表示目标文件,a.txt表示虚拟备份文件(虚拟指的是备份的文件不占用内存,只有当源文件被删除掉之后才真正代替原来的文件成为源文件,这个时候才占用内存)。
(14)apt-get:下载或卸载软件,不管是下载还是卸载的过程必须要在网络环境下,也就是说Ubuntu必须处于网络环境;
apt-get install vim:下载安装一个vim软件。
apt-get remove vim:卸载vim软件。
vi和vim:vi是Linux操作系统的内置编辑器,这个东西是在当初没有鼠标的时代才开始使用的,所有的编辑任务仅依靠键盘操作,这个编辑器的操作难度还是很大的,就连退格都需要快捷键,你说有没有难度?我们推荐使用vim,它是vi的升级版,比vi好用得多,通过apt-get install vim安装即可。只需要通过vi a.txt或者vim a.txt就能打开或创建a.txt文件,这里的vi不是指内置的vi编辑器,在你下载了vim之后vi就成了指向vim的一个符号链接,也就是所谓的快捷方式。
vi的两种模式
命令模式:vi一打开就默认是命令模式,你的所有输入它都当做是命令来处理。
输入模式:输入模式可以向编辑器输入内容,在命令模式下按a或者i键即可进入输入模式,之后就如同普通的编辑器一般可以随意输入了,如果你想保存退出,按键盘左上角Esc键即退出输入模式回到命令模式,然后通过指令:wq来保存编辑的内容并退出,如何辨别当前是命令模式还是输入模式?很简单,当你通过vi a.txt指令打开指定文件的之后,如果你左下角什么都没显示则表示当前处于命令模式,如果左下角显示INSERT则表示当前处于输入模式。
vi指令(指在命令模式下的指令)
:w :只保存不退出,指令最前面是冒号,属于指令的一部分,下同;
:wq :保存并退出;
:q :不保存直接退出;
:q! :不保存强制退出;
:wq!:保存并强制退出;
/keyword :查找关键字,指令最前面是斜杠“/”,下同。后面是要查找的关键字,如果找到了光标直接跳到关键字处;
/lines :直接跳到指定行号,lines表示行号,按回车后光标直接跳到指定行号处;
:set nu :设置显示行号,vim中默认是没有行号的,需要我们通过命令让他显示。这个设置是临时的,关掉文件重新打开又没有行号了;
:set nonu :设置隐藏行号,什么时候你会不想看到行号呢?是的,在你复制代码的时候,如果编辑器中带行号,那么行号将会被一起复制过去,这个时候你就得一个一个删掉行号了;
在命令行中通过vim ~/.vimrc进入vim的配置文件,在里面写set nu并保存,以后打开vim就默认带行号了;
dd :快速删除行,在vim编辑器中将光标移到某一行,直接输入dd可以将该行删除;
ndd:快速删除多行,在编辑器中将光标移到某一行,直接输入n(表示数字)dd可以直接从该行开始连续删除n行,光标所在行算第一行。例:8dd表示从光标所在行开始连续向下删除8行;
nyy :连续复制行,在编辑器中从光标所在行开始向下连续复制n行,光标所在行算第一行。例:8yy表示从光标所在行开始向下复制8行;
p :黏贴所复制的行的内容,在编辑器中从光标所在行的下一行开始黏贴。
(15)普通用户与超级用户(root用户)切换:超级用户没有权限限制,操作什么都可以,普通用户却有很多地方受限;
sudo -s:这条命令用来从普通用户切换至root用户;
sudo apt-get install xxx:普通用户临时借用root的权限执行后面的操作,因为像下载文件这种操作只有root用户才能做,普通用户做不了,这个时候如果你不想切到root用户就可以使用本指令,在不需要切换用户的情况下来临时借用root的权限,操作执行完之后就不再拥有root权限了;
su username:这条命令用来从某用户切换至某用户,username是用户名。可以从root用户切换至普通用户,也可以从普通用户切换至root用户,但是你可能会出现普通用户且换到root用户失败的问题,即使你输入了之前root用户的密码,系统还是会提示验证失败,这时你需要通过指令重新设置一个root用户的密码。指令如下:su passwd root,接着终端会显示 "Enter new UNIX password: ",然后你设置一个密码,,回车,接着终端显示 "Retype new UNIX password: ",再次输入密码,回车。密码设置成功之后终端会提示“passwd: password updated successfully”表示你root用户的密码设置成功了,然后就可以通过su root或者直接su从普通用户直接切换到root用户了,当然这个过程需要刚才设置的root用户的验证密码,如果是root用户切换到普通用户则不需要密码。那么普通用户切换到普通用户呢?这个过程需不需要密码?不用问啦,肯定要的,当初系统设计出来就不是只给一个人使用的,早期电脑是多人共用的,每个人在系统中都有一个用户,自己的用户中保存着某些信息当然不希望别人能够随便访问到,因此普通用户切换到普通用户加了密码验证也是出于安全考虑。
(16)find 模糊路径 -name xxx:通过模糊路径在其下找xxx文件,例:find / -name a.txt。表示在根目录下查找名为a.txt的文件,但是路径最好尽可能的详细,否则系统可能会查很久,这与电脑配置和文件数量有关;
(17)grep -nr keyword 查找范围:在文件中查找某个词,xxx表示文件中出现的关键字名称,查找范围其实是某个路径,约束了范围之后查找工作就会在指定范围中进行。例:grep -nr "hello" *,查找所有的文件并找出所有包含hello关键字的文件,一般都是在当前目录下查找。-n表示查找结果中显示的行号,-r表示递归,从当前目录开始找,如果目录下还有其他目录,就会递归查找,即进入子目录下继续查找。
(18)which和whereis:查找一个应用程序(二进制文件)的位置,用的较少。注:命令行中所有的命令都是应用程序;
which ls:表示查找应用程序ls所在的路径;
whereis ls:表示查找应用程序ls的路径、源码、man手册的位置,即罗列出详细的信息;
(19)uname:查看系统信息;
uname :显示当前的系统名称;
uname -r:显示内核信息,通常用来查看内核版本;
uname -a:显示详细的系统信息;
(20)tree:显示文件和目录从当前目录开始的树形结构;
(21)mount和umount
mount:用来将磁盘挂载到文件系统中,比如插U盘,在我的电脑就出现了一个磁盘,我们可以使用这个磁盘中的内容,这就是挂载,例:mount -t nfs -o nolock ip:port/root/rootfs /mnt。表示将远端指定ip的某个目录挂载到本地mnt目录下,这时候我就能操作远端挂载过来的目录内容了。
umount:有挂载就有卸载嘛,这里的卸载不是卸载软件的意思,如果说mount挂载的过程相当于插U盘,那么umount卸载的过程就相当与拔U盘,例:umount /mnt。之前我们挂载到哪个目录,你就在哪个目录卸载即可,一般都是操作/mnt。
(22)df -h和du -h filename
df -h :显示已挂载的分区列表(相当于windows中的磁盘分区信息);
du -h a.txt:显示文件的大小;
(23)chmod:修改文件或目录的访问权限(以下两种方式皆可);
chmod 编码值 文件名:可读r,可写w,可执行x采用的编码方式是BCD编码,分别表示4,2,1,学编程的都知道,例:chmod 755 a.txt。表示修改a.txt的访问权限,755代表的权限序列为 rwxr-xr-x。
chmod 组+权限 文件名:给某一个分组增加权限。组表示我们之前说的9个权限字符序列每3个归为1组。rwxr-xr-x:rwx为第一组,表示文件拥有者的权限,该组的符号为u;第二个组r-x表示拥有者所在的组的权限,该组的符号为g;第三个组r-x表示其他用户所在的组的权限,该组的符号为o。例:chmod g+w a.txt。表示给a.txt拥有者所在的组添加一个可写的权限,执行效果为rwxrwxr-x。
chmod 组-权限 文件名:给某一个分组取消权限。与上面类比。
(24)压缩和解压缩:压缩是把文件或目录打包,解压缩就是把打成的包解开拿出里面的文件或目录;
tar -czvf abc.gz dir/:把dir目录打包成gz格式的压缩文件;
tar -cjvf abc.bz2 dir/:把dir目录打包成bz2格式的压缩文件;
tar -zxvf abc.gz :把gz格式的压缩文件解压;
tar -jxvf abc.bz2 :把bz2格式的压缩文件解压;
(25)网络配置命令
ifconfig eth0 ip:设置ip地址;
ifconfig eth0 up:启用网卡;
ifconfig eth0 down:禁用网卡;
ifup eth0:启用网卡;
ifdown eth0:禁用网卡;
ifconfig eth0 ip netmask subnetmask:同时设置ip和子网掩码;
(2x)开关机:
shutdown -h now:立即关机;
init 0:关机;
shutdown -r now:立即重启;
reboot:重启;
上面的命令都很简单,但是我们也可以采用让系统休眠的方式以最低功耗当计算机保持当前状态,当下次唤醒计算机的时候原来机器在做什么就还继续做什么,比如你听歌听一半休眠了,唤醒之后仍然继续播放,这么做是为了避免每次关机、开机、打开软件所耗费的时间,而且休眠是低功耗的,因此也不会消耗多少电量;直接在虚拟机运行按钮那里找到挂起,这个就是休眠了。
Linux中的符号
. :一点表示当前目录;
.. :两点表示当前目录的上一层目录;
- :一横杠表示在进入当前目录之前的目录,即是从哪个目录cd过来的,例:cd -;
~ :波浪线表示当前用户的宿主目录,例:cd ~;
/ :斜杠表示根目录;
$ :表示普通用户的命令行提示符;
# :表示root用户的命令行提示符;
* :星号表示通配符,可以匹配一个或多个字符,比如abc.txt abd.txt abe.txt,如果使用ab*可以全部匹配到;
宿主目录:操作系统给用户设置的一个工作空间,系统希望用户把所有的文件都放到这个目录下,相当于windows中的我的文档;Linux操作系统中每个普通用户都有自己的宿主目录,这个目录在/home/username/,username是你的用户名;root用户的宿主目录在/root。