【技术分享】小乖乖的 Linux/Ubuntu 历险记

时间:2021-09-05 16:05:18

本文将同步发布于 WHU-TD 的博客。

这是一篇自带故事背景的博客。

总所周知,写的多,错的多,更何况一个刚刚接触 Linux 的小白。虽然只是介绍一些非常基础的内容,还是希望大家在发现错误时可以及时指出。我一定会虚心地更正。

说起来这种又臭又长还没什么营养的博客大概没什么人看吧。如果拆成几篇专门写某个部分的话大概看的人会更多吧。emmm 不过我还是想写一篇这样的博客,虽然网上的教程已经足够丰富了。如果要问为什么,大概是想整理自己的学习成果,还有,就是想搞点不太一样的东西吧。

可能有点自说自话,请见谅。我会尽可能写清楚的。虽然很幼稚,跟小乖乖这个名字很配。

还有,本文面向小白。

本文以 Linux 小白小乖乖的身份,介绍了想在 Linux 下编写 Hello World.cpp 时遇到的种种问题,并由这个特定的情境,引入介绍了 Linux 的相关基础知识。

此外,Linux 下打开终端的方法有三个:

  1. 在文件夹或桌面上右键 “用终端打开(run in terminal)”
  2. Ctrl + Alt + T
  3. Alt + F2 输入 gnome-terminal

P.S. 除了第零章,每一章的第一节都是特定的场景,可能没有什么用处,大家也可以跳过。

P.S. 本文主要基于 Ubuntu 20.04.1 LTS 当然各种版本毫无疑问是有共同性的。

P.S. 我忘记压缩一下图片了呜呜呜

好的我压缩好了改过来了。现在加载应该快了吧 ~

应该不至于看不清吧。(委屈.jpg)

零、我们是开发者

(这一章属于吹水部分。自行斟酌跳过。)

小乖乖不想学 Linux

相信大家多多少少对 Linux 都有一定的了解。比如,废物小乖乖就知道 Linux 是一种操作系统,CCF 的评测系统就是在 Linux 上跑的(大概)。

在上一期 zpy 大佬的博客中,我们学习了 Linux 系统的几个优点,然而固执的小乖乖并没有因此燃起学习 Linux 的兴趣。

为什么总有人告诉我要学 Linux ?Windows 用着不香吗?Windows 就不能跑代码了吗?气抖冷

事实上,对于学习 Linux ,小乖乖有两个极端的看法:

  1. 学习 Linux 就是学习操作系统的原理和开发。管它安不安全开不开源,开了我也看不懂,这跟现阶段还在学 C 语言的我也太遥远了吧?
  2. Linux 系统是 Windows 系统的备胎。就跟 Android 和 IOS 差不多,反正都只是操作系统,会一个就行了。我现在 Windows 还用的好好的,让我去学 Linux 干什么?

总而言之,基于功利性的“学了有什么用” 的思维方式,小乖乖原本并没有心思去学 Linux。

不过,在部长 hxj 的悉心指导下,小乖乖逐渐明白了学习 Linux 的意义和目的。

(以下内容为查询各种资料后,得出的、纯属个人意见的对学习 Linux 与 Linux 优点的理解,部分内容可能会与上一篇博客相重叠。也许你们会说博客应该以技术分享之类的硬核内容,但我认为,有必要先讲清楚学习的目的。就个人的看法而言,我不喜欢在看完面包的介绍前,就被人强行塞进嘴巴里。当然,我也只是一名 Linux 的初学者,许多观点和看法可能是幼稚而错误的,希望大家能指出发现的错误。)

在我看来,Linux 与 Windows 最大的区别在于:前者主要是为服务端、开发者设计的系统,后者主要是为客户端的用户体验而设计。

Windows 拥有丰富的图形界面和大量方便的娱乐、办公应用程序,而 Linux 虽然没有那么强大的图形界面,但由于开源的优势以及对开发者强大的吸引力,Linux 拥有大量开发者编写的插件、工具。

同时,Windows 复杂的图形界面,实现起来必然是繁琐而复杂的,而在这个实现的过程中,步骤越多,可能出现的漏洞也就越多,可能暗藏的被攻击的缺口都越多。而 Linux 不同,Linux 具有的图形界面较为基本,主要的操作都需要利用命令行来实现。同时,Linux 作为开源项目,是大型的网络开发项目,参与 Linux 维护的开发者数量远多于 Windows 。“足够多的眼睛,就可以让问题浮现”。 这也是 Linux 透明化、安全性高的原因。

同时,上篇博客中提到的可移植性,也使得 Linux 在人工智能/智慧设备等领域有较高的适应性。

当然,也许这些对于现阶段的我们,并没有多大的意义。我们并不明白怎么利用图形界面下隐藏的漏洞,不明白怎么利用 Linux 的开源资源来进行自己的开发,我们也没有任何管理服务端的经验(开过 MC 服或过于神仙的大佬请自习忽略这段话)。

我想,我们学习 Linux,不仅仅要把它当成一种用户端的操作系统,熟悉其图形界面与 Shell 下基本的操作,也不仅是学会 git 或是 gdb 这样的特定工具(当然这里列举的工具并不限定于 Linux 系统),更重要的是利用学习 Linux 的踏板,熟悉命令行下的操作、转变自己的思维方式。

我想,我们是开发者,不应让由于熟悉和习惯产生的惰性遮住我们的眼睛,不应让自己成为套死在某种别人开发好的工具上的猴子。

上面那句话是一个刚接触 Linux 的小白一厢情愿地对自己说的,仅代表个人极不成熟的观点,你们可以忽略。

命令行的重要性

命令行的重要性在于装逼。

跟图形界面下的操作不同,命令行操作需要你对自己想要干什么有一个清晰的认识,才能选择恰当的命令,这有助于整理自己的思维。

同时,命令行相对较为简洁。你不用像图形界面下那样,一层一层打开窗口。

命令行也方便于操作的记录,便于你回想起你的上一步在干什么。

部分的命令行操作是图形界面所无法完成的,比如访问 / 目录(雾)。

下面以 Windows 下的 cmd 控制台为例。

P.S. Windows Dos 的命令与 Bash 有很大的区别,比如给命令添加的要求不是用 - 而是 /。不过可以多去试试,便于熟悉。(毕竟使用 help/? 就可以很轻松的查到详细的中文提示,如果单纯的想试命令行操作,学起来是飞快的。至于复杂的循环、条件结构和各种运算符语法,度娘可以解答一切)其实 Bash 也可以用 --help-? 来查指令,就是可能没有中文。

以 Windows 下删除某个文件夹中的可执行文件为例。

我们进行 C 语言基础编程学习已经有一段时间了。相信大家也已经编写了大量的程序。细心的同学还会用不同的文件夹来存放代码。于是,一个问题就出现了。编译产生的可执行文件,一不留神就攒下了一堆。这些文件大多只是在老师检查作业的时候运行以下就没再碰了,但堆多了就显得文件夹很乱,也占用空间。

在一般情况下,我们要删除这些文件,无非就是一个文件夹一个文件夹地找,然后用 ctrl 键把它们选定,然后一点一点地删掉。

但使用 dos 命令可以很快地完成这个工作。

cd /d D:\_ACM
del /s *.exe

如果你厌烦一次一次输入,你也可以创建一个 .bat 后缀的文件,将上面的代码复制进去,每次只需要点开它就行了。

好尬啊这个应该都会吧

至于 /d /s 这些参数还有命令,都可以在 cmd 窗口快速的查询。如:

cd /?

P.S. cd (change directory) 是改变当前工作目录的指令。后面会提到一点的绝对路径和相对路径,大概会加深你对这个命令的理解。此外 /d 是 Windows 下切换磁盘,而 Linux 下并没有 C盘 D盘 这样的概念。 cd 命令或许会成为之后我们使用最为频繁的指令之一。

好吧我跑题了,记得是要讲 Linux 来着。

你可以把在 Linux 桌面上双击 a.txt 的操作理解为 gnome 捕获鼠标动作后帮你执行了 gedit a.txt

总之知道命令行和脚本语言很有用就对了。

学会获取帮助文档

ls (list files) 命令为例如:

ls --help
man ls
info ls

虽然大多没有中文,而且help 里有的中文翻得像机翻,但这并不能阻碍各位英语大佬们阅读文档的热情(确信)。

需要小心的是,info 下的键入某个键时,会被读取为命令,例如,按下 q 是退出,光标移动到链接上按下 space 会进入文档。info 提供的是一种阅读解释文档的方式。

如果没有使用 info 的经验,可以直接用不带任何参数的 info 命令来查看说明。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

如果你习惯把某个命令的帮助信息写入文件中方便阅读,可以这么做:

man ls > ls.txt

其实在 dos 里也有类似的用法 就是把命令执行后输出的信息写入某个文件中。

dir /? > dir.txt

P.S. dir 命令在 Linux 下似乎同样有效。与 ls 有相似的效果,都是列出当前目录下的文件或目录。

记住命令的方式之一就是联想英文全称

比如删除文件,在 dos 里是 del,在 bash 里则是 rm,其全拼分别为 delete 和 remove 。

所以如果你不知道某个命令叫什么,把能想到的缩写都用 man 查一遍,总能找到的。man 的各种参数可以用 man --helpman man 查到。

虽然我当时没猜到 rm ,直接跑去百度了。

runoob 上的 Linux 教程其实相当详细。去上面学习可以很快地掌握。

啊啊虽然这么说但是先别跑啊把我的博客看完(雾)

虽然部分内容我在博客中给出了较为完整的代码,但实现的方式其实不止一种。例如换源时你们可以用 root 用户来修改。

我不希望看完我的博客后,你们只知道复制粘贴我或是其它博客的代码。

一、跨出的第一步

小乖乖以为要搭建环境

Linux 下 C 语言开发环境的配置快得飞起,把没见过世面的小乖乖吓坏了。

在 Windows 上,我们需要下载 mingw64 ,然后进行一系列乱七八糟的安装或是环境变量的配置。

而在 Linux 下,只需要这么一行:

sudo apt install gcc g++ gdb vim

(其实这里面有些东西比如 gdb 是自带的,这个命令运行后只是把它更新了一遍。)

当然 vim 并不是必须的,vim 是终端下一个很强大的包含代码高亮的文本编辑器

Linux 本身自带了一个 vi ,gnome 桌面则自带了一个 gedit。gedit 类似于 Windows 下的记事本,而 vi/vim 则是基于命令行的。

在第二章中,会对 vi/vim 文本编辑器的基础操作做简单的介绍。与前文讲到的 info 有一定的相似之处。

P.S. 输入密码时光标是不会移动的,也就是说不会像输入 qq 密码那样显示星号和圆点。输完按回车就行了。如果你一直密码错误,可以检查一下你的数字小键盘是不是关掉了、大写锁定是否打开了之类的。如果你连密码都记错了,emmm 那你可以参考这个

apt 指令与 root 用户

首先,当涉及软件包的安装和更新时,我们需要在指令前加上 sudo 。这有点类似于 Windows 下的“以管理员身份运行”。

如果不习惯使用指令安装,也可以通过 Ubuntu Software 来搜索并安装,操作类似于 Windows 下的应用商店。(它的搜索图标在左上角,有点小。)

需要注意的一点,使用指令安装时是在设定的下载源处检索软件包。如果下载源没有收录你想要的软件包的话是无法安装的。

实际上,也有很多软件需要在官网或 Github 上找到后按它的提示进行安装。如 Typora,oh-my-zsh,linux qq 之类的东西。

此外,默认情况下,apt 会把软件安装到当前用户下。

# 更新软件列表
sudo apt update
# 安装软件(以zsh为例)
sudo apt install zsh
# 删除软件(以zsh为例)
sudo apt remove zsh
# 升级软件包(全部)
sudo apt upgrade
# 还有 search list 等各种命令,可以自行通过 man 查询。

既然提到了用户,我们就来谈谈 root 吧。

sudo 可以理解为 “以管理员身份运行” 。据目测,在使用 sudo 输入密码后,我们 5 分钟左右不用再输一次密码。

大家如果用过安卓系统的一些游戏修改器之类的,想必对 root 权限,或是 超级用户权限 这样的词汇不会感到陌生。(当然,现在大多数手机出于安全和稳定的考虑已经无法轻易开启 root )

再或者,有一些电脑(比如高中时机房的电脑)的默认用户是 Administrator ,实际上这也是超级管理员。

初次使用 root 用户,需要为 root 用户设置密码。之后就能使用 su (switch user) 命令切换到 root 下了。

sudo passwd root
# 输入一次当前账户密码、两次给 root 设置的密码。
su root

下面这两张图大概可以在某种程度上说明 root 用户与普通用户的区别。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

root 用户可以直接使用 apt install 而不需要添加 sudo。

此外,不难发现,由于我将 oh-my-zsh 安装在了 qing-lkyi 下,并且所有的配置都在普通用户下完成,所以 zsh 的高亮消失了,shell 恢复成了默认的 bash。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

普通用户不加 sudo 权限不足。

同时,从 pwd (print work directory) 的结果来看不难发现,普通用户的 ~ (默认工作目录) 要比 root 的 ~ 处在更末端的位置。

这种表述可能有点不太精确,但我想不到更合适的说法了。

在后面终端美化时,我会向大家建议使用 root 用户进行操作。

此外,别乱用 root。小心带来破坏。

破坏就破坏呗,反正虚拟机,多玩玩熟悉一下也好。

Ubuntu 换源

首先,换源指的是换 apt 指令的默认下载源,不是换 Ubuntu 的源代码。

在师兄第一次让我讲换源时,我就产生了这种奇妙的误解。

实际上,各个国内镜像站的指南在如何操作上讲得已经非常详细了。不过我还是简单地介绍一下两种方式吧。

第一种是图形界面下的操作。不需要多做解释。

先找到这个

【技术分享】小乖乖的 Linux/Ubuntu 历险记

然后修改下载源 (在“其它”里选)

【技术分享】小乖乖的 Linux/Ubuntu 历险记

第二种是命令行下的操作。此处以清华源为例。

第一步是拷贝原有的软件源配置文件。

# 此处可以注意区别两种方式
cd /etc/apt
# 这里是方式1 会在 /etc/apt 下创建一个拷贝文件
sudo cp sources.list sources.list.copy
# 这里是方式2 拷贝到 ~ 的下级文件夹
cp sources.list ~/Desktop/sources.list.copy

P.S. 文件不一定要命名为 .copy ,我只是为了方便区分。

由于普通用户没有在 ~ (也就是 /home/qing-lkyi) 的上级目录中创建文件的权限,所以在使用时需要 sudo。

cp 到当前用户的工作目录下(也就是在当前工作目录下创建文件),则不需要 sudo。

当然,为了防止丢失,备份到 /etc/apt 下还是比较推荐的。

第二步是修改。

# 选择自己喜欢的文本编辑器来修改就行了
# cd /etc/apt
sudo vi sources.list
sudo vim sources.list
sudo gedit sources.list

同理,普通用户是没有修改 ~ 上级目录中的文件的权限的。所以需要 sudo。

将该文件里的内容删掉或注释掉,直接改成各个镜像站提供的代码就行了。

如清华源的:(注释不是我写的,是它自带的)

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

保存(写入)后退出即可。

有些博客好像先更改了 sources.list 的权限再修改,不过我的实际操作中是不需要这一步的。

另外,如果你之前已经安装过了像 typora 这样的软件,可能需要保留安装时添进去的部分,如

deb https://typora.io/linux ./
# deb-src https://typora.io/linux ./

如果你不确定自己的删减是否会对这些软件的更新产生什么样的影响,那么建议采用图形界面下的换源方式,它会自动为你保留这些额外的软件源。

P.S. 其它国内源的操作同理。这里给出几个公认能够信任的源的帮助页面作为参考。

清华源: https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/

网易源: http://mirrors.163.com/.help/ubuntu.html

中科大源:http://mirrors.ustc.edu.cn/help/ubuntu.html

阿里源: https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b116UQE41

虽然我不太清楚镜像站是干啥的,不过好牛逼的样子

无论哪种方式,在完成换源后,最好使用如下指令来更新:

sudo apt update
sudo

P.S. 在上面我们 cd 到了 /etc ,那么这个文件夹是干什么的呢?

(以下内容引自百度知道)etc是 and so on 的意思,来源于法语的 et cetera 。在/etc下面存放的是配置文件等一些零碎的东西。

感兴趣的可以 cd 到 / 目录下,看看各个文件夹里都放了些什么东西。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

二、文件与目录

小乖乖想创建文件

小乖乖遇到了一个难题:如何创建一个 hello world.cpp

通过查阅博客,小乖乖发现 touch 可以创建一个新文件。

于是小乖乖自作聪明的键入了这样的命令:

cd ~/Desktop && mkdir ACM && cd ACM
touch hello world.cpp

于是创建了 hello 和 world.cpp 两个文件(雾)

小乖乖不服,又键入了:

rm hello world.cpp
touch "hello world.cpp" && ls -a

心想着这次总该创建出来了吧,结果 ls 出来一个带单引号 'hello world.cpp'。

没见过世面的小乖乖吓坏了,打开图形界面下的文件夹一看,才发现这个单引号只是为了 ls 展示时避免误会加上去的,真实的文件名并没有引号。

愚蠢的小乖乖流下了不争气的眼泪。

P.S. 其实空格也可以用 \ 转义。比如小乖乖就可以这样打开文件:

vim "hello world.cpp"
# 或是
vim hello\ world.cpp

命令行下的文件操作

首先谈谈创建文件与文件夹。

在上面的情境中,我们已经看到了 mkdir touch的效果。

其中 mkdir (make directory) 就是创建文件夹。而 touch 严格来说并不是新建文件,而是 change file timestamps (修改文件时间属性) ,在没有 -a 情况下,如果文件不存在,就会创建一个空文件。

rm (remove) 在第零章也有点到。rm 默认只是删除文件,如果想删除包括文件夹在内的整个目录(如 ACM),需要使用 rm -r ACM

同时,在上面的情境中大家也不难发现,touch 和 rm 可以在后面同时接多个文件。

关于这两个命令跟深入的解释及其建议,可以通过 man rm 来查询。

ls 命令则可以列出某个目录下的文件,及其权限、数量、时间等。如:

# 查看 sources.list 的权限要求
ls -l /etc/apt/sources.list

P.S. 使用 ls 指令列出文件时,你可能会看到两种不同的颜色,这是为了区分文件与文件夹。使用 -a 参数,则可以列出隐藏的文件(大多是 . 开头的)。至于那些比较特殊的,高亮跟别的不一样的文件,我也不明白其中的原因。(例如 /usr/bin/mount 或是 /etc/localtime 之类的,目测都是一些可执行的文件)

此外,你还可以通过文本编辑器来创建新文件。如:

# 当前不存在 a.txt
gedit a.txt
vim a.txt

需要注意的是,文本编辑器的原理是在某处创建一个临时文件,然后你会在文本编辑器中修改这个临时文件。只有保存、写入了,这个文件才算真正创建完成,不然你只是打开了文本编辑器而已。

绝对目录与相对目录

Linux 的文件路径,有点类似于 Android。

啊不对我说反了,应该说 Android 的文件路径,有点类似于 Linux。

二者都以 / 为根目录,也都用正斜杠来分割目录。

前面也有提到,Linux 下没有 C盘 D盘的说法。关于这一点我不想讨论(因为我也不会)。

在此处,我想介绍一下 相对路径绝对路径

其实我想这一点大家都非常清楚,没有介绍的必要。只是我在一开始接触 Linux 时,遇到过一个难以理解的问题。

由于 Linux 的根目录是 / ,而子目录与父目录间也是靠 / 分割开,所以我一开始看到 /usr/bin 这样的路径时,我完全没转过弯来。我以为这个最前面的 / 是用来分割子、父目录的,以为加与不加没有区别。我甚至猜测了好久这个 /usr/bin 是在哪个目录下才存在的相对路径。

直到后来,我才知道第一个 / 可以理解为根目录,这个 /usr/bin 是绝对路径。

下面举两个例子,一个 Windows,一个 Linux:

  1. 假设当前 cmd 处在 C:\ 目录下,而 C:\ 的子文件夹 Windows 中存在一个文件 py.exe ,此时,这个文件的相对路径就是 Windows\py.exe ,而绝对目录则是 C:\Windows\py.exe。
  2. 假设当前 shell 的工作目录是 ~ (/home/qing-lkyi) ,而桌面的 ACM 文件夹中有一个 a.cpp ,则相对路径为 Desktop/ACM/a.cpp ,绝对路径为 /home/qing-lkyi/Desktop/ACM/a.cpp

使用 cd 可以改变当前工作目录,使你能够使用更短的相对路径。在你需要在某个文件夹中执行很多操作时,cd 进去会让你的工作方便许多。

P.S. 在使用 ls -a 时我们会发现每个目录最开始基本都有两个这样的东西:. 和 .. 。其用法是 cd .. ,可以前往上一级的目录。

前面介绍过的 pwd 指令则可以告诉你当前的工作目录。

此外,Linux 中也有类似于 Windows 中 %path% 那样的环境变量的东西。如:

# 查询当前正在运行的是哪种 shell
echo $SHELL

(echo 与 dos 中的使用方法相同,效果类似于 C 中的 printf)

P.S. 使用 ls /usr/bin ,你会发现各种各样的命令都放在那里面。不难发现,与 Windows 中每一个 dos 命令其实都是在调用 %path% 目录下的某个可执行文件的原理类似,而每个 bash 命令也是在执行某处存在的可执行文件,而你在命令后输入的参数,则是那个文件执行时传入的参数。而这也是我们在使用 gcc 编译指令时需要在环境变量 path 里添加 mingw64\bin 的原因

三、文本编辑与 Vim 配置

小乖乖不会用 Vim

没错,小乖乖不会用 Vim。

Vim 的具体使用教程可以参考runoob

此处只对一些最基本的使用和注意事项进行一些介绍。

首先,Vim 是基于终端的文本编辑器。

我们知道,在 Linux 的终端下,光标并不会随着我们鼠标的点击而移动。但是,我们仍可以利用鼠标选定一段文字,然后使用 Ctrl+Shift+C 拷贝。

P.S. 粘贴和拷贝 (Ctrl+Shift+V) 操作在终端上需要用上 Shift ,而非终端界面下则不需要。以及光标不会随鼠标点击移动这一点,是使用 Vim 需要适应的第一个问题。

使用 vim 指令打开一个文件后,我们需要通过键盘键入命令。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

P.S. 不要乱按键盘!不要乱按键盘!不要乱按键盘!在进入底线命令行模式或插入模式前,你在键盘上的每次敲击都可能会被解读为命令。

目前,小乖乖只会按 i 进入插入模式后在上面输入内容,然后按 Esc 退出插入模式,输入 : 进入底线命令行模式。

此处再引用一下 runoob 的三个图片:(节省空间,只放链接不展开)

1

2

3

在底线命令行模式下,比较常用命令如下:

  • :w 保存 (write) 或者说写入
  • :w! 强制写入只读文件 (需要权限)
  • :q 退出,在后面加上 ! 则是不保存强制退出
  • :wq 上面的命令和 ! 也可以组合起来用
  • :h 查看帮助文档(同样需要 :q 来退出帮助文档)
  • :! command 暂时离开 vim 执行某个 shell 命令 (在编写 shell 脚本时忘了语法就可以用这个指令)

Vim 有自带的代码缩进。而且高亮也挺好看。可以去试一试。

环境变量与 Vim 简单配置

其实这部分我本来没打算写的。结果翻了下网上的博客,发现自己根本没有 VIM 这个变量,~ 目录下也找不到 .vimrc 。*自己乱翻了一通。所以干脆也写一下好了。

首先是第一个问题:找到配置文件的位置。

根据网上的博客,Vim 在安装时会默认为我们预设一个环境变量 VIM ,只需要 cd $VIM 然后找到 vimrc 就可以进行修改。

而现实是,由于某种不知名的原因,我根本没有这个变量。

P.S. 想查看环境变量的值,可以使用 echo $HOME ,若输出空行,表明变量为空或不存在。

既然它没有,那我们可以手动搞一个。 (参考)

# 查看 vim 的安装和配置文件位置。
vim --version
# 使用随便一个文本编辑器打开 /etc/profile 文件
sudo vim /etc/profile
# 打开后在文件最后加入一行:
# export VIM=/usr/share/vim
# 保存后,手动在右上角注销就行了。
# 你也可以直接重启(好像没区别?)
reboot

需要注意的是, export 后面跟的是一个完整的表达式,不能在乱加空格,否则会被解读为多个并列表达式。此外,/usr/share/vim 这个是根据 vim --version 查到的,建议自己查一下不要照搬。

(其实 /etc/vim 里头也有一个这样的东西)

你也可以试着看一下 profile 文件里面是啥。一不小心可能就学会了 shell 脚本的循环和 if

另外,profile 文件的修改需要注销后生效。

P.S. 直接使用 export 指令也可以设置环境变量,不过跟 Dos 的 set 一样,设置的这个环境变量是暂时的。想要永久地保存,只能通过修改系统文件。

这里也可以大胆猜测一波,profile 是每次注销重启后会自动运行的文件。

事实证明,在我往这个文件的最末尾添加 gedit 后,每次重启时它都会打开一次 gedit 的界面。猜想成立。

(不过这个是危险动作,在没有把握时请勿随意模仿,别乱改文件把系统改崩了)

P.S. 《算法竞赛入门经典第二版》的最后部分有写到 Linux 下的常用命令,其中有提到 set 可用于修改环境变量。然而在实践中,我发现 set 指令并没有这样的功能(只能显示而不能修改)。也可能是版本不同的缘故吧。当然,Windows 下的 set 确实有修改变量的功能。

此外,不知道为啥 man export 查不到帮助文档。

嗯,好像跑题了,让我们继续 vim 的配置。

经过一波猛如虎的操作,我们打开了 $VIM/vimrc

sudo vim $VIM/vimrc

然后小乖乖看到了如图的注释,发现里面并没有配置项,需要自己写进去,于是小乖乖意识到需要找到注释里的 debian.vim 来参考。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

接着小乖乖发现自己连 VIMRUNTIME 这个环境变量都没有,根本找不出来。本节完。

没办法,小乖乖只能去找官网了。结果发现官网要登陆,于是又灰溜溜地回来了。

然后小乖乖试着运行了如下命令: sudo find / debian.vim

【技术分享】小乖乖的 Linux/Ubuntu 历险记

当场去世。小乖乖终于意识到自己可能装了个假 vim。

(也许只是误会了注释的含义 debian.vim 这个文件本来就不存在)

由于装逼失败,所以*向博客屈服。小乖乖挑了个博客教程 开始照着打了(雾)。

cd ~ && touch .vimrc
vim .vimrc
# 然后在打开的文件中输入
set tabstop =4
set shiftwidth =4
set nowrap
# :wq 保存并退出即可
# 至于为什么要加这两项配置,因为默认的八空格 tab 是真的毒瘤

P.S. 其实 Vim 还有其它强大的功能和插件,大家可以自行查找资料,或者我们后续的博客中也会讲到这样的内容。

Linux 文件权限

小乖乖的 hello world 打炸了。需要写个对拍。

但是小乖乖不会 bash,所以只能从最基础的开始学起了。

(其实这里我想直接抄紫书的代码上来的,但是解释起来太麻烦了,不解释又显得很毒瘤,就干脆随便编一个别的了)

啊我是不是忘了解释 shell 是什么了。可以简单地与 Windows 下的 cmd 控制台类比。Shell 是一个应用程序,提供了一种通过终端窗口用命令行操作系统的方式。或者说,shell 是一种命令行解释器。

Linux 的脚本与 dos 下的脚本(也就是我们常说的批处理文件 .bat )非常相似。

简单地说,脚本的意义在于把多行的命令提前编写好,然后通过脚本来便捷的运行。

当然,脚本语言也有自己独特的语法,这里让我讲清楚是不可能的(因为我也不会)。所以此处只是作为文件权限的引入。

首先我们写一个简单的脚本。根据脚本的语言,我们可以自行选择后缀名(如 py php)也可以不用后缀名。只需要在最开头声明自己的类型就好了。

现在,我们新建一个 test.sh 。

#!/bin/bash
for i in ~/Desktop/ACM/*.cpp; do
cat $i >> a.txt
done
unset i

(这个是我模仿 profile 里的那个循环打的。其实没有啥用。就是把直接目录下的 .cpp 全部拷贝到 a.txt 里)

但是,只有这个是不能运行的。因为新创建的文件并没有可执行的权限。

使用 ls -l test.sh 可以看到它的权限。

(以下内容引自这里)

r 是 readable 即可读取,w 是 writeable 即可写入,x 是 executable 即可执行。

查到的权限分为三部分:

  1. 文件所有者/超级用户 u (user)
  2. 与文件所有者在同一群组中的用户 g (group)
  3. 其它的用户 o (others)

目前,我们只需要知道第一部分其实足够了。

而第二部分可以像上午的网安导论课上老师讲的那样理解:

比如,所有者是“打印员”中的一员,那么 g 就是其它同样是打印员的人具有的权限。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

P.S. ls 查到的第一个参数是文件类型。d - 目录(文件夹) ,- 则是文件。

我们可以使用 chmod(change mode) 修改文件权限。

# 赋予所有用户执行 test.sh 的权限
# a 表示 all 所有用户
chmod a+x test.sh
chmod u+x,g+x,o+x test.sh
# 赋予所有用户完整的 rwx 权限
chmod 777 test.sh

P.S. 权限的数字表示:1 对应 x,2 对应 w,4 对应 r。是基于二进制的三个数位的。

例如,我们希望 u 的权限为 rwx,r 的权限为 rw-,o 的权限为 r--。我们可以这么干:

chmod 764 test.sh

在修改完后,我们就可以用 source test.sh 来执行了。

番外、咕咕篇

按照牛顿第三定律,番外篇肯定是要咕的。不然澳大利亚的袋鼠每年也不会参与印第安人的啤酒节聚餐了,特朗普也不会受到二氧化碳排放增加的影响了。

说起来现在才讲中文设置是不是有点晚了

因为写太多了我已经懒得再解释了。自己鼓捣或是看别的我参考的博客吧。

Linux 中文 & 时区设置

自己鼓捣。我懒得截图了。

说不截还是随便截一下的。

总之就是在桌面找到 Setting 和 Language Support 那两个图标基本就可以完成了。

大家手机用得那么溜翻个设置算什么。

【技术分享】小乖乖的 Linux/Ubuntu 历险记

【技术分享】小乖乖的 Linux/Ubuntu 历险记

【技术分享】小乖乖的 Linux/Ubuntu 历险记

Zsh 与 Oh-my-zsh 安装

zsh 是个好东西。至少目前用起来很舒服。比如 tab 路径补全和 oh-my-zsh 舒适界面。

zsh 的命令跟 bash 很像。除了 help 命令用不了以外基本一致。

参考这里

# 先装 zsh
sudo apt install zsh
su root
# 安装的指令去官网 https://ohmyz.sh/#install 查
# 使用 curl 的话你还要这个
sudo apt install curl
# 如果你没有*, 建议使用 wget, 至少我遇到了一点错误
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
# 然后你会看到连接失败 (403) 的是 raw.githubusercontent.com
# 于是去 site.ip138.com 查下 ip
# 然后调个地理位置较近的如 151.101.76.133 (不晓得是不是固定的,所以还是查一下)
ping 151.101.76.133
# 也可以挑别的 ping 一下,看着差不多还行就 Ctrl+C 强制终止执行
# 用文本编辑器打开
sudo vim /etc/hosts
# 在最后一行加入 (以 151.101.76.133 为例)
# 151.101.76.133 raw.githubusercontent.com
# 然后再跑一次上面的安装命令
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
# 看到作者在终端输出的那个很骚的 Oh My Zsh 才算成功

【技术分享】小乖乖的 Linux/Ubuntu 历险记

其实在终端的图形界面上也有可以调的。比如字体、配色。可以去试试。

Oh-my-zsh 插件与主题

参考

# 在这里查询自带的插件/主题
ls $ZSH/themes
# 每个插件文件夹里面都有个 readme.md
ls $ZSH/plugins
# 在这个目录下获取其它的非自带的插件/主题
cd $ZSH/custom && ls
# 根据作者的注释编辑这个文件来设定插件/主题
vim .zshrc
# 编辑 .zshrc 文件。注释很详细了。
# 如果你是在安装时自带的那几个里面挑主题,设置时记得别把后缀名也复制进去了
# 外来插件的安装可能相对复杂,参考博客试一试

因为我不会,所以以下内容不限期咕咕咕。部里的其它小伙伴也可以接坑。

Linux 硬盘

Linux 各目录下文件功能

Vim 进阶操作与插件/美化

Git 基础操作及原理

gdb 调试基础

虚拟机与主机间的文件共享

虚拟机与主机间的网络通信

Gnome 桌面美化/主题更换

Shell Script 详解

Linux 火狐浏览器部分 js 失效的处理

Linux 快捷键一览

未完待续

没错上面的我都不会。

END