Maco

闭花羞月

嗨,我是张志方 (@Maco),一名 iOS 开发者。


Linux命令行

这篇文章旨在介绍一些常见概念、命令,尽量以容易理解的语言描述,适合Linux和命令行新手入门。 任何技能都是孰能生巧,所以现在就打开终端操作吧。

目录

  1. 基本概念
  2. 常用命令
  3. Vim
  4. 常见问题

一、基本概念

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

除了以上介绍的之外,还有一些指令,比如greptailsourcetouchalias等,以及操作符|>>>等也较为常用,出于篇幅考虑留给大家自己Google或者用到的时候去查吧。总之命令行没什么可怕的,即便是图形界面,你也会遇到不明白什么意思的选项,也会遇到不知道怎么解决的报错,遇到问题去Google就好,肯定能解决,而且每解决一个问题,就学到一点知识。

三、Vim

Vim或Vi是Linux操作系统中常用的文本编辑工具,它非常简洁,但也能通过扩展变得非常强大;学习曲线陡峭,但是熟练之后可以达到更高的操作效率(想想曾经的五笔)。不过我个人不是很倾向于使用Vim输入大量内容,毕竟IDE才是更高效的选择,基本上在简单修改的时候才使用。但是在命令行中编辑文件,Vim也是为数不多的选择。

1. Vim的三种模式

首先介绍三种模式,因为Vim都是用键盘操作,不同模式下,按键有不同的含义。执行任何操作前,都要先观察一下当前所处的模式。

  1. 命令模式:刚进入Vim时的默认模式,可以执行各种命令,但是不能输入内容,键盘按键都代表不同的命令。命令模式下,可以输入:并紧跟其他指令来执行比如保存、退出等操作。命令模式下,窗口左下角不会显示任何内容。
  2. 插入模式:可以输入内容,但是不能直接移动光标。插入模式下键盘按键会直接输入按键表示的字符。在命令模式下,按iao等命令可以进入插入模式,并定位光标到不同位置(当前,行末,新行行首等)。插入模式下,窗口左下角会显示-- INSERT --
  3. 选择模式:在命令模式下,按v可以进入选择模式,并以当前光标位置开始选择;按下ESC键或者执行任意其他指令,如拷贝、删除等,将结束选择模式并进入命令模式。选择模式下,窗口左下角会显示-- VISUAL --

2. 打开或创建文件

vim [文件名或带路径的文件名]

举例:vim a.txt将会在当前目录创建一个名为a.txt的空文件并使用vim打开。

3. 移动光标

命令模式和选择模式下:

使用方向键或hjkl键移动光标,hjkl

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
最近的文章

手机触摸屏实现原理

对于屏幕,在生活中随处可见,电脑、电视、手机等等,我们今天要介绍一下平时用的手机触摸屏或者电脑触摸屏的基本原理。触摸屏的主要三大种类有电阻技术触摸屏、表面声波技术触摸屏、电容技术触摸屏,没一类触...…

继续阅读

更早的文章

OC与Swift混编之project-Swift.h

swift开源那么久了,大家肯定了解过并且使用过swift,使用oc开发那么久,项目比较大的情况下,肯定不能一下全部换成swift,有的同学可能会先使用oc与swift混合编程,所以就涉及到混合...…

SwiftObjective-C桥接文件继续阅读