你好命令行
学习命令行的意义
graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible.
进入命令行
打开终端,终端terminal
软件就是一个窗口,窗口里面看到什么是不一定的,默认情况下执行的是命令解析器,linux术语叫做shell
程序。
shell
就是一个程序,它接受从键盘输入的命令,然后把命令传递给操作系统去执行。我们后面要学习的各种ls\cd等等。
而终端窗口也可以执行其他程序,比如输入python,就进入了python语言的命令解析环境。control+D可以回到shell环境,control+L可以清屏。
Shell Prompt 命令提示符
![](https://img.haomeiwen.com/i13852523/4f3d49268c3e0d61.png)
shell中一直有的这段我们称为命令提示符。它由下面几个部分组成:
-
Username
——zhanglala -
Machiename
——ubuntu -
CurrentWorkingDirectory
——~代表user home,这里就是/home/zhanglala -
command
——光标所指的那个位置
其它符号$啊#啊之类的意义后面会一一介绍。
Command命令
![](https://img.haomeiwen.com/i13852523/84ab65e5c995de0d.png)
我们以删除一个目录的命令简单解析一下命令的组成部分:
-
命令本身——
rm
-
参数——
-r
-
操作对象——
test/
man 命令
可以打开一个命令的手册查看详细介绍,比如:
![](https://img.haomeiwen.com/i13852523/c3ae3f0701294cb2.png)
看到了rm命令的详细使用方法:
![](https://img.haomeiwen.com/i13852523/c4864bc40725188a.png)
要查找具体某个参数的用法,就输入
/参数
+回车![](https://img.haomeiwen.com/i13852523/fbcc584081606d0e.png)
就能定位到文档中-r第一次出现的准确的位置,查找下一处敲
n
即可,退出用户手册q
。
在文件系统跳转
文件系统树结构
Window是这样的,硬盘分区CDE,每个分区下面有文件夹,层级嵌套,每个分区下面都是类似的,有几个分区,就有几个文件系统树:
![](https://img.haomeiwen.com/i13852523/49c45f2a57a0567d.png)
而linux也有硬盘分区,不叫CDE叫sda1
,sda2
......虽然是这么多分区,但是对应的文件系统树只有一棵树,那这个分区怎么对应文件系统?linux中有个挂载点
的概念,比如把sda1挂载到/
上,那在/
目录下存放的数据,就会放在sda1这个分区,其他同理:
![](https://img.haomeiwen.com/i13852523/5a3f40799e205367.png)
一棵树
上面已经说过,Linux只有一个文件系统树,我们下面明确几个概念。
-
Root Directory 根目录
就是它——/
-
Current Working Directory 当前工作目录
这不是某个固定的位置,而是用户登录进来之后,进行各项操作,正所处的位置,说白了就是你正处在哪个文件夹里面。可以用pwd打印出来(Print Wroking Dir):
绝对路径和相对路径
-
绝对路径
以/
开始。
-
相对路径
通常以.
开头,就是相对当前工作目录,也有..
,是相对当前目录的上层目录。
cd(change directory)命令的使用
![](https://img.haomeiwen.com/i13852523/a8b04a620c831ad6.png)
操作文件和目录
常用操作:
![](https://img.haomeiwen.com/i13852523/d468ac1188ae79ca.png)
![](https://img.haomeiwen.com/i13852523/553590d5e4f6e76b.png)
补充的其他的:
1.创建隐藏文件或者隐藏目录,只要文件名以
.
开头即可。隐藏文件是ls
看不到的,只能用ls -a
;2.Linux对文件后缀不敏感;
3.查看文件用
cat
会比较乱,用less
则是分页的,j
向下滚屏,k
向上滚屏。/
进行字符查找,n
下一处查找位置,两次小写g
可以到文件头,两次大写G
可以到文件尾,q退出。man的分页就用的less;4.
vim
更常用;5.通配符
*
6.打包压缩,三种压缩文件。
-
zip
类型
解压缩——unzip zip文件名
压缩——zip zip后的文件名 ....(要压缩的文件或文件夹)
一开始有两个文件:
然后压缩一下(用到了通配符*)
解压就不演示了 -
.tar.gz
和.tar.bz2
类型
这两种不能用zip和unzip。
先看tar.gz类型。- 解压用
tar zxvf 文件名
x是extract - 压缩用
tar zcvf 压缩包名 要压缩的dir或者file
c是compress
然后是tar.bz2类型
- 解压
tar jxvf 文件名
- 压缩
tar jcvf 包名 要压缩的dir或者file
- 解压用
重定向
说白了就是拐弯。先举个简单的例子,date
可以查看现在的时间,在控制台输出,如果使用重定向,可以把它的输出打印到某个文件中,不会被打印在屏幕上。
![](https://img.haomeiwen.com/i13852523/f1762ff35ee0864b.png)
下面这个是重定向了
ls
的信息![](https://img.haomeiwen.com/i13852523/691c867e7b8f812a.png)
三个重要的文件
linux下面"everything is file",所有东西都是文件,file是file,dir也是特殊的file,我们的硬件设备,比如鼠标,光驱等等,也是被抽象成了一个个文件,放在/dev
下面。可以用一个文件名打开一个文件,但是系统每打开一个文件也会给这个文件分配一个叫文件描述符的东西(file decriptor),系统中有三个文件是比较特殊的,他们是一直打开的,系统就为这三个文件分配了固定的文件描述符。
-
stdin标准输入文件
——file decriptor为0 -
stdout标准输出文件
——为1 -
stderr标准错误输出文件
——为2
重定向的方式
-
redirect stdout输出重定向——
>
把一个程序的输出保存到指定的文件当中。
注意:>
重定向输出时候会清空源文件的,而>>
则是追加,但cat
本身就有连缀的作用,所以我们看到倒数第四行那样的操作 -
redirect stderr标准错误输出重定向——
2>
这个作用就是,有时候程序运行出现错误,系统不希望把错误信息打印到屏幕上,而是把错误信息输出到某个文件里,就用到错误输出重定向。
下面这个例子,我们首先ls一个不存在的东西,然后提示没有这样的文件或者目录,我们用>
重定向也是失败的:
而用2>
就是可以的:
-
redirect stdin标准输入重定向——
<
管道线——|
直接把前面一个程序的输出作为后面一个程序的输入。
![](https://img.haomeiwen.com/i13852523/baff73cb8122ecda.png)
linux-用户和文件权限
home is writable,当前用户只在自己的主目录之下有写权限,在其他目录则没有写权限。
![](https://img.haomeiwen.com/i13852523/84b13d7ba2abdc87.png)
这里zhanglala在自己的主目录下就可以创建一个test文件:
![](https://img.haomeiwen.com/i13852523/98bc2f74a3755d91.png)
而跳到根目录,再去执行这样的操作就是Permission Denied了:
![](https://img.haomeiwen.com/i13852523/93f9e5102268108b.png)
而要创建,则需要sudo
命令,要用超级用户权限:
![](https://img.haomeiwen.com/i13852523/fb8dd5ac8cae75ab.png)
常见的场景就是用
apt-get
安装程序时候,肯定不是写在用户目录下面的,这时候就要用超级用户权限了。![](https://img.haomeiwen.com/i13852523/fbaa4014db45dc38.png)
例如安装vim就把最后那个pakage写上vim就好了。
三种权限——rwx
-
r
——reading -
w
——writing -
x
——executing
linux是个多用户的操作系统,意味着很多人可能同时使用一台计算机,可能会编辑同一个文件,根据对文件的权限的不同,系统把用户分为了三类。
对文件权限的讨论,就是讨论这三组用户对这个文件有没有rwx的权限。
文件模式——file mode
对文件权限的讨论要落脚到文件模式上。
用ls
加上-l
参数,查看一个文件的信息会是这样的:
![](https://img.haomeiwen.com/i13852523/a60c38c8aafbdf44.png)
-
第一位——file type
sym link是符号链接,暂时先不要管。
-
第二位到第十位一共九位——
file mode
文件模式
-
后面的1——
link number
硬链接的数量 -
第一个zhanglala是
owner
-
第二个zhanglala是
group
-
6——
size in byte
文件大小,这里是六个字节 -
后面就是修改时间和文件名了
查看目录的这些信息ls
后面要用-ld
参数,那九位代表的意义有所差别。
![](https://img.haomeiwen.com/i13852523/c5b234afef813262.png)
这里做了对比:
-
r
-
w
也就是说,能不能删除重命名这个文件,与拥有文件本身的w
无关,而是与是否拥有这个文件所在目录的w
有关系。
改权限使用chmod +w .
,注意最后面有个小点点。这里就给mydir加上了w
: -
x
给一个普通的文件加什么执行权限没有什么意义,我们新建一个脚本文件a.sh
。
用vim
:
进入vim
之后,小写i
进入插入模式,我们插入一段文字:
![](https://img.haomeiwen.com/i13852523/7e2f831f1d7dc947.png)
然后
esc
,并且大写Z
两次,保存退出vim。我们现在执行一下,发现跪了,没有权限:
![](https://img.haomeiwen.com/i13852523/6eb919e13fbcf617.png)
查看一下:
![](https://img.haomeiwen.com/i13852523/e2788d6ef5488682.png)
果然没有,可以changemode一下:
![](https://img.haomeiwen.com/i13852523/f3753794ff00b021.png)
现在再执行,就这样了:
![](https://img.haomeiwen.com/i13852523/f94e814efc3fa8d7.png)
所以对文件来讲,有没有x
,就意味着能不能执行这个文件,而对目录来讲,则是能不能cd
进去。
![](https://img.haomeiwen.com/i13852523/740b172d81070dc6.png)
chmod
这个我们上面用过很多次了,不过我们是chmod +这样用的,还可以这样用(用八进制形式,图中还举出了两种错误用例):
![](https://img.haomeiwen.com/i13852523/f47deb466ea8efc9.png)
除了直接去动那九位,还可以动owner
和group
去改变权限情况,通过chown
命令。
进程
获取进程号PID
linux中有个ps
命令,我们用man
查看一下:
![](https://img.haomeiwen.com/i13852523/d658f4a92eae7702.png)
报告系统上当前进程的状况。
我们这里就用一下。首先打开个vim,vim就会占据当前的shell
,可以用ctrl
+shift
+t
打开另一个新的shell
,可以在上面的edit,里面的keyboard shortcuts
里面设置快捷键。
![](https://img.haomeiwen.com/i13852523/876f343a7cec8cbb.png)
查看所有进程是使用
ps -aux
,在新的shell里面我们查看一下(这里管道重定向到less
,因为输出内容有些多,所以分页一下):表头是这样的:
![](https://img.haomeiwen.com/i13852523/df3fc59b8c980fb3.png)
我们重点关注USER和PID。
有大量的进程,我们用/vim
查找一下:
![](https://img.haomeiwen.com/i13852523/57a5ca5b655599e0.png)
也可以直接用grep指令来查一下在shell里面输出:
![](https://img.haomeiwen.com/i13852523/b92defed5e334711.png)
补充
我们在终端中拷贝粘贴的方法是双击选中内容,ctlr + shift + c
和ctlr + shift + v
,ctlr + a
可以光标移动到行首
这里我们看到PID之后,用kill pid
的命令结束指定的进程。
![](https://img.haomeiwen.com/i13852523/7407ce5e832c7b89.png)
然后我们切到上一个打开vim的终端去(快捷键是shift + pageup键
),发现vim被终止了:
![](https://img.haomeiwen.com/i13852523/164fab656c2a7ddf.png)
命令行还可以启动图形化的程序,比如直接输入firefox
火狐浏览器就运行了,我们可以用Alt + Tab
来切换回命令行,我们回到命令行后发现,这个
![](https://img.haomeiwen.com/i13852523/5e756f96fbb5c3c5.png)
shell貌似处在了阻塞状态。。被firefox给占住了。为了避免这种情况,就涉及到了下面的后台执行。
后台执行
1.使用firefox
之后不要立刻回车,而是空格后,再敲一个&
![](https://img.haomeiwen.com/i13852523/aa78efe6622b5551.png)
这样程序就自动在后台执行了,切换回终端,shell并没有被firefox占据。
2.如果说已经像刚才那样没有用&
,firefox运行起来了,shell被占据了,那么就进行下面的操作:
![](https://img.haomeiwen.com/i13852523/916d749d5c44b5e0.png)
ctrl + z
,切到firefox时候,已经停止了,不能进行界面操作了。这时候再使用bg
:![](https://img.haomeiwen.com/i13852523/cd58b1bfd5947cf0.png)
这样就和上面使用
&
效果一样了,它会在后台执行。而再使用fg
,就又可以让firefox占据shell,回到前台,就可以使用Ctrl + c
来终止它了。
kill命令结束进程
kill
指令可以用来结束进程,结束进程有不同方式,kill
命令的不同形式,相当于给进程发送不同形式的信号。
ctrl + c
实际上就是kill向终端发送INT中断
信号,终止了一个正在运行的程序。
kill
后面不加任何参数,就是kill向终端发送中执行好,如果进程还"活着",就会被终止。
上面这两个例子都是在程序正常运行时候是有效的终止手段。
而程序出现了异常(假设vim出现了异常,已经无法接受输入),不能这样去终止。就要使用其他手段,杀死进程。就是我们一开始演示打开另一个新的shell
,终止vim的kill pid
。
而更加糟糕的一种情况是,异常程序占用了大量内存导致桌面系统直接死掉了(比如firefox卡死了,桌面动不了),无法在shell进行任何输入。此时的解决问题的方法是,linux同时运行了
7
个工作台。使用Ctrl +Alt + F1
就可以到达第一个工作台。 在那个工作台杀死进程,然后Ctrl + Alt + F7
就可以回到那个图形化工作台。在里面登入用户名密码:
![](https://img.haomeiwen.com/i13852523/677184d04505bda2.png)
然后按照上面的方法区杀死目标进程,
![](https://img.haomeiwen.com/i13852523/6f3a78f49be8fc76.png)
坑
需要注意的一个坑是。。这个工作台下貌似不读取右边小键盘的数字的输入,导致我在login时候密码输入都是错的,提示Unbuntu login incorrect,但是linux又不显示密码位数....卡了很久,才发现。使用字母键盘上方的数字可以解决问题。
除了kill之外,很多程序也定义了自己的退出方式,比如shell,就可以使用exit
来退出,或者使用Ctrl + D
快捷键。
Linux-查找
这节学习在命令行环境下如何进行搜查的操作。
locate——全局范围内定位文件
比如这里查一下fuck,发现linux里面竟然有brainfuck命名的文件夹....
![](https://img.haomeiwen.com/i13852523/2bc411b71589013e.png)
locate也是支持正则表达式定位的。
locate
+--regexp
+正则表达式
我们做下面的实验,有些意外:
![](https://img.haomeiwen.com/i13852523/b1d93c692f59ecbe.png)
发现定位不到我们自己创建的777.txt。为什么?就要谈到
locate
的底层运行原理。locate
并不是直接在File System里面去查找文件,而是在数据库里面去找匹配的文件,这也就能解释为什么Locate为什么会这么快,新的文件touch之后会隔一段时间updatedb
更新数据库的数据,不过遗憾的是,updatedb
往往是一天执行一次,所以才出现我们刚刚的情况。补救的办法就是手动运行一下 updatedb,不过需要
sudo`,超级用户权限![](https://img.haomeiwen.com/i13852523/f116169b8a7f7320.png)
这时候再locate,发现找到了~
![](https://img.haomeiwen.com/i13852523/9fae7bf912577a6e.png)
find——目录范围内定位文件
find就是给一个目录,就把目录翻个底朝天。
find .
就直接列出了当前目录的所有结构:
![](https://img.haomeiwen.com/i13852523/51a0e555d9bc7dbd.png)
还可以用grep
来过滤,如使用'find .|grep .txt`
![](https://img.haomeiwen.com/i13852523/fd41e3b9e916fa3c.png)
还有-type
参数,来筛选类型,f
和d
分别表示文件和目录:
![](https://img.haomeiwen.com/i13852523/58d38218f865291c.png)
我们找到一个文件的目的还是要对它进行一番操作,find
命令提供了一个十分强大的参数-exec
,用';'
做结束符。在两者之间就可以输入任意的系统命令,'{}'
可以表示查找到的文件名。
![](https://img.haomeiwen.com/i13852523/f2ef25e2013f1179.png)
这里就给查找到的所有文件执行了
ls -l
命令。
下面还有一个示例,我们使用grep
,对查找到的文件进行字符串查找。
创建一个含有"fuck"的fuck.txt,和"FUCK"的fuck2.txt。
![](https://img.haomeiwen.com/i13852523/deb05d6da0e70892.png)
然后
grep
来找:![](https://img.haomeiwen.com/i13852523/ffd7381c8e28902f.png)
依次用的参数就是
-print
,把所在文件打出来,-n
把在哪一行打出来,-i
忽略大小写去查。
这样就可以在任何一个目录里面去查找字符串。
grep——字符串查找利器
上面的grep
指令有一些复杂,视频教程的老师提供了自己的项目happygrep
,这个看视频吧。
网友评论