这篇文章旨在介绍一些常见概念、命令,尽量以容易理解的语言描述,适合Linux和命令行新手入门。 任何技能都是孰能生巧,所以现在就打开终端操作吧。
目录
- 基本概念
- 常用命令
- Vim
- 常见问题
一、基本概念
1. 文件(file)
Linux或者基于Unix的系统,其所有资源,包括硬件资源,都是以“文件”的形式体现,比如应用程序,网卡等。所以当提到某块硬盘,某个程序,某个配置,你首先应该知道,它同样是一个文件。下面提到文件的时候,都表示这个含义,而不是狭义的文档文件。
2. 用户,用户组(user, user group)
Linux、Window、macOS甚至Android,都是多用户操作系统。一个用户会有独立的私有空间,创建的文件(注意上面的概念),会有用户的标识,从而控制是否允许其他用户访问。 用户组就很好理解了,就是一组用户。
3. root用户
root用户是权限最高的用户,可以对操作系统执行任意指令,root用户也被叫做super user。
4. 目录(directory)
目录可以理解为文件夹,但是,目录依然是一个文件。
家目录/主目录:在Linux上登录一个用户,一般会自动定位到一个目录,这个目录就是家目录,对于一般用户,比如abc,家目录位于/home/abc/
(macOS上,用户家目录位于/Users/abc
),如果是root用户,家目录位于/root/
。家目录也可以用~
波浪符号表示。
/:根目录,顾名思义,根目录就是目录树的顶层,所有路径的根节点。
.:当前目录,嗯,就是当前目录。
..:上级目录。
5. 权限(permission)
权限问题可能是新手会遇到的最多,也最懵逼的问题,Linux通过用户来划分文件的访问权限。一个文件,会通过一组标记位来表示该文件的可访问状态。访问操作包含:读取,写入,执行。
查看权限信息的命令:ls -l
(命令在第二部分会完整介绍)
如果你搜索过权限问题,那么对这组标记不会陌生:drwxrwxrwx
。
上面列出的是全部标记为真的情况,事实上很可能是这样的-rw-r--r--
。
一共10位标记位,第一位含义是是否按目录访问;后面9位分为三组,每组3个标记位,分别表示是否可以读取、写入、执行
,每一组的权限都是针对某个用户或用户组而言。
第一组针对文件的所有者用户(一般是创建者)。(所有者权限)
第二组针对文件的所有者用户所在的同组其他用户。(组权限)
第三组针对不同组的其他用户。(其他用户权限)
举例A用户创建了一个txt文件,该文件权限为-rw-r--r--
,那么A可以读,写,但是不能执行(这里不能执行时因为该文件本身不可执行,并不是因为A没有权限);其他同组用户和不同组用户都只能读取内容,但是不能修改(写)。
权限表示方法。权限在很多时候会通过三个十进制数字表示(r-4(100),w-2(010),x-1(001)),比如777,每个数字表示上面所说的一组权限。每一组权限可以用3位二进制表示,所以每一组权限可以转换成1个十进制的0-7。比如-rw-r--r--
表示成644。
6. 命令行,终端(command line, terminal)
首先要明确一个概念:命令行和图形界面一样,都是一种交互界面,交互界面的功能,就是接收用户输入,反馈执行状态并输入接口。
所以不要看着命令行觉得可怕,相比于设计的不好的图形界面,命令行反而会反馈更多信息。如果没有特别的需求(比如需要在Linux上使用IDE),强烈建议只使用命令行界面。
命令行的交互方式简单:输入指令,观察结果。事实上图形界面的工作原理,都是通过把鼠标的点击操作,映射成一条或多条指令完成的,只不过反馈方式不同而已。
二、常用命令行命令
在列举常用命令之前,需要先明确一个概念,这里说的“命令”,同样也是一个应用程序,既然是应用程序,那么同样也是一个文件,既然是文件,那么也会出现无权限访问的情况。所以,执行命令,就是运行一个应用程序。
$: man
描述:显示某个命令的说明,man即manual(手册)的缩写。所以当你有个指令不知道有什么参数可用,不知道参数什么意思,可以用man指令查看说明,还可以锻炼下英语。
用法:man [指令]
举例:man grep
查看grep的用法
$: cd
描述:进入某个目录。也许是用的最多的命令之一了,既然所有资源都是文件,那么做的最多的工作就是找到这些文件,并在目录间跳来跳去。
用法:cd [路径]
举例:
cd ~
进入家目录
cd /
进入根目录
cd ./a/b/c
进入当前目录下的a/b/c
目录
cd -
(减号)后退到刚才在的目录(不是上级目录)。比如在~
目录执行cd /etc
会进入/etc
目录。再执行cd -
会会退到~
,而执行cd ..
会进入/
目录。注意两者的区别。
cd ..
后退到上一级目录。(向上)
$: ls
描述:列出某目录(默认当然目录)下的文件。
用法:
ls
ls [路径]
ls -l
列出文件,并包含详细信息。
ls -a
列出所有文件(包含隐藏文件:文件名以.开头)
举例:
ls
ls /
ls -al
列出所有文件,并打印详细信息。
$: clear
描述:清屏。其实是终端屏幕内容向上滚动,隐藏历史输出内容。
用法:clear
举例:clear
$: sudo
描述:使用root用户身份执行,当执行某操作时,比如安装软件,当前用户权限不足,就需要使用sudo。使用sudo时需要输入当前账户的密码,能执行sudo的前提,是当前用户在sudoer列表内。
用法:sudo [其他指令]
举例:sudo yum install vim
系统范围内,使用yum安装vim。
$: su
描述:切换用户。
用法:
su [用户名]
su
切换到root用户,切换到root用户需要输入root用户密码。
举例:
su abc
su
等同于 su root
$: mkdir
描述:创建目录
用法:
mkdir [目录名]
mkdir -p [目录树]
如果目录树上有目录不存在,将自动创建
举例:
mkdir ~/a
在家目录下创建a目录
mkdir -p ~/b/c
在家目录下的b目录下创建c目录,如果b不存在,将创建b,再创建c。
$: mv
描述:移动文件
用法:mv [文件] [目标目录]
举例:mv a.txt ~/a/
移动当前目录下的a.txt
文件到~/a/
目录下。
$: cp
描述:拷贝文件
用法:
cp [文件] [目标目录]
cp -r [目录] [目标目录]
举例:
cp a.txt ~/a/
cp -r ~/a ~/b
$: cat
描述:打印文件内容。如果只想查看文件内容,可以使用cat,而不是vim。
用法:cat [文件]
举例:cat ~/a.txt
$: chmod
描述:修改文件权限。
用法:
chmod [权限值] [文件]
直接设置权限值
chmod [对象][操作][权限] [文件]
单独操作某个权限。对象、操作、权限分别用符号替换,就能进行精细操作。
对象:
a
全部,u
所有者权限,g
组权限,o
其他权限。(见上文权限部分)操作:
+
增加权限,-
减少权限。权限:
r
读,w
写,x
执行
chmod -R [其他操作]
递归应用到目录及目录内容
举例:
chmod 740 a.txt
将a.txt的权限设置为740表示的权限:?rwxr-----
。
chmod a+x a.txt
将a.txt的三组权限,增加可执行标记位。
chmod og+w a.txt
将a.txt的写权限,赋予同组用户以及其他用户。
这里只列出权限操作的部分方法,权限除了读,写,执行,还可能有其他限制,这里不做讨论。
$: chown
描述:修改文件所有者
用法:
chown [用户].[组] [文件]
chown -R [用户].[组] [目录]
举例:chown -R nginx.nginx projects
当projects目录的所有者,修改为nginx组的nginx用户。
$: history
描述:命令行操作历史记录。查看刚刚输入过的指令。
用法:
history
! [序号]
使用感叹号加history输出结果前面的序号,可以快速重新输入该条指令。
举例:history
除了以上介绍的之外,还有一些指令,比如grep
,tail
,source
,touch
,alias
等,以及操作符|
,>
,>>
等也较为常用,出于篇幅考虑留给大家自己Google或者用到的时候去查吧。总之命令行没什么可怕的,即便是图形界面,你也会遇到不明白什么意思的选项,也会遇到不知道怎么解决的报错,遇到问题去Google就好,肯定能解决,而且每解决一个问题,就学到一点知识。
三、Vim
Vim或Vi是Linux操作系统中常用的文本编辑工具,它非常简洁,但也能通过扩展变得非常强大;学习曲线陡峭,但是熟练之后可以达到更高的操作效率(想想曾经的五笔)。不过我个人不是很倾向于使用Vim输入大量内容,毕竟IDE才是更高效的选择,基本上在简单修改的时候才使用。但是在命令行中编辑文件,Vim也是为数不多的选择。
1. Vim的三种模式
首先介绍三种模式,因为Vim都是用键盘操作,不同模式下,按键有不同的含义。执行任何操作前,都要先观察一下当前所处的模式。
- 命令模式:刚进入Vim时的默认模式,可以执行各种命令,但是不能输入内容,键盘按键都代表不同的命令。命令模式下,可以输入
:
并紧跟其他指令来执行比如保存、退出等操作。命令模式下,窗口左下角不会显示任何内容。 - 插入模式:可以输入内容,但是不能直接移动光标。插入模式下键盘按键会直接输入按键表示的字符。在命令模式下,按
i
、a
、o
等命令可以进入插入模式,并定位光标到不同位置(当前,行末,新行行首等)。插入模式下,窗口左下角会显示-- INSERT --
。 - 选择模式:在命令模式下,按
v
可以进入选择模式,并以当前光标位置开始选择;按下ESC
键或者执行任意其他指令,如拷贝、删除等,将结束选择模式并进入命令模式。选择模式下,窗口左下角会显示-- VISUAL --
。
2. 打开或创建文件
vim [文件名或带路径的文件名]
举例:vim a.txt
将会在当前目录创建一个名为a.txt
的空文件并使用vim打开。
3. 移动光标
命令模式和选择模式下:
使用方向键或hjkl
键移动光标,h
左 j
下 k
上 l
右
4. 进入插入模式
命令模式下:
i
在光标位置进入插入模式。注意,此时光标并没有位置变化,之后输入的内容都会插入到光标位置。
I
在行首进入插入模式。
a
在行尾进入插入模式。(a -> append)
o
换行并进入插入模式。
O
下移当前行,并在新行进入插入模式。
5. 退出插入模式、选择模式
在插入模式、选择模式下,按下ESC
键,进入命令模式。
6. 删除
命令模式下:
x
删除光标所在字符
[任意数字]x
先输入任意数字,再按x
,从光标位置开始,删除多个字符。
X
删除光标前一个字符,”退格”。
D
删除光标位置到行尾。
dd
删除整行
7. 拷贝、粘贴
选择模式下:
y
拷贝选择的内容
命令模式下:
yy
拷贝整行
p
粘贴到光标后
P
粘贴到光标前
8. 退出、保存
命令模式下:
:q
退出,关闭文件。如果当前文件有未保存的修改,Vim将不允许退出,并会在最下面一行进行提示。
:q!
强行退出。忽略未保存的内容。
:w
保存,保存对当前文件的修改。
:wq
保存并退出。
四、常见问题
1. command not found:
当你在网上找到一条指令,输入终端之后提示not found,是不是很尴尬?
和图形界面不同,终端内输入指令的时候,是不知道这条指令是不是能识别的(毕竟就是一行字符串)。所以遇到这个问题,安装相应的软件包即可。每个Linux发行版都有自己的默认包管理器,比如CentOS使用yum
,Ubuntu/Debains使用apt-get
。
以yum
为例,比如vim不存在,执行sudo yum install vim
即可安装vim
。大多数软件包都可以按照这种方式安装,个别情况,如果yum
的安装源(就想一个软件包仓库)没有你要装的软件,那么就要更新源或者添加源,这时候就视情况而定啦,请使用Google大法。
2. xxx is not in the sudoers file
使用sudo命令时,可能会出现这个错误:当前用户不在sudoer列表内。 解决方法:
# 切换到root用户
su
# 修改sudoers文件权限,让root可以执行。(是的,默认root也没有写权限)
chmod 740 /etc/sudoers
# 编辑文件,在最下面插入 [用户名] ALL=(ALL) ALL 并保存。
vim /etc/sudoers
# 恢复文件权限。
chmod 440 /etc/sudoers