Linux工作环境

展示了Gnome、KDE、Xfce三种主流的桌面环境;在Linux中,桌面环境和其他千千万万应用程序一样,只是一个程序(并没有集成到内核中)。之后简单介绍了配置文件、运行级别和显示启动信息的内容。

GNOME

bilibili观看,

或者到 YouTube 观看。

KDE

bilibili观看,

或者到 YouTube 观看。

XFCE

bilibili观看,

或者到 YouTube 观看。

配置文件

大多数Linux程序是通过编辑一个配置文件来定制程序;配置文件中包含有程序需要读取的信息,通常是在程序启动时读取。

Windows通过注册表(不鼓励修改)和.ini文件存储配置信息,在Linux中没有集中的注册信息,实际上,每个程序允许拥有自己的配置文件,并且鼓励用户进行修改(在合适的权限下)。

配置文件大多存放在/etc或者家目录下该程序的文件夹中。

下面是几个例子:

配置文件 内容
/etc/hosts 系统已知的一系列主机名称和IP地址。
/etc/passwd 每个用户的标识信息(口令是加密的)。
/etc/profile 每个用户标识登陆时系统自动执行的命令。

运行级别 init

运行时级别(runtime level)指允许特定进程组存在系统软件配置。简单地说,就是系统对于不同的级别,提供不同的服务。下面是典型的运行级别(不同系统可能不一样):

运行级别 描述
0 停机(关机)
1 单用户模式(命令行)
2 非标准化
3 多用户模式(命令行)
4 非标准化
5 多用户模式(GUI)
6 重新启动

运行时级别是在每次系统引导时配置的。

在大多数情况下,Linux默认引导至运行级别3或者5.

有时候系统管理员要做一些不允许其他用户登录的操作,这时候需要引导至运行级别1.

可以使用下面的命令进行关机:

# init 0

显示启动信息 dmesg

使用dmesg命令查看系统在启动时的信息。

$ dmesg | less

虚拟控制台

每次Linux启动时都会引导7个不同的终端仿真程序,称为虚拟控制台。使用<Ctrl>-<Alt>-<F2>来切换到第二个控制台,更换<F2>来切换到其他控制台。

Linux预备知识

简单介绍了Linux的来历,简单介绍了主机、控制台和终端的联系,简单介绍了客户端与服务器的关系。

Linux 简单介绍

Linux 是一个操作系统的内核,与很多其他软件一起构成一个完整的操作系统。

1991年的10月5日,linus在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生。

Linux 不是 UNIX系统,它们源代码不同(但设计理念非常相似)。

Linux是开源软件。

开源和免费 没有 关系(只是碰巧很多软件既开源又免费而已)。

一些公司、机构、程序员将Linux内核和其他软件经过修改和加工并分发,称为Linux发行版。

Linux的吉祥物是一只企鹅,名叫tux。

吉祥物tux

相关:

主机、控制台和终端

在unix诞生之初,还没有个人计算机,大多数计算机都是大型、昂贵、不稳定的机器,必须存放在湿度和温度可控的环境中。

贝尔实验室的Thompson和同事们开始寻找小并且便宜的计算机,1970年他们得到了一台 PDP-11(这种计算机比较便宜)。

在那个年代,计算机还没有独立的键盘, Thompson决定使用一种便宜的电传打字机,叫做Teletype(直到如今,Linux系统中的文本输入输出环境仍然简写为tty)。

Ken Thompson(坐)、Dennis Ritchie(站) 与PDP-11 和T eletype 33-ASR(竖着的、高高的、有很多按钮的是PDP-11,他们使用的打字机是 Teletype 33-ASR)
Thompson-pdp.png-23.5kB

PDP-11机身上有很多按钮,这个操作面板被称为 控制台(console)

很多操作需要通过控制台完成(比如启动过程中遇到的问题),因为只用当主机启动并且网络连接正常后才能连接网络终端。

由于当时计算机昂贵的价格,Unix被设计为多个用户通过自己的Teletype来访问PDP-11,Teletype扮演的角色称为终端(terminal),PDP-11扮演的角色称为主机(host)

  • 计算机=主机+终端
  • 终端=输入设备+输出设备

连接多台主机和终端的设备,叫作终端服务器。

相关:

客户端与服务器

当你去镖局托运物品,你是客户端,镖局是服务器。

当你去客栈吃饭,你是客户端,客栈是服务器。

客栈店小二在自己家客栈吃自己送来的饭,他既是客户端也是服务器。

(上面的例子只是为了说明道理,实际中没人这么叫,除非计算机呆子。)

当你Google搜索时,你在浏览器中按下回车后,浏览器向 Google公司的某计算机请求数据,这个计算机将信息返回给浏览器,这个过程中浏览器就是客户端, Google公司的某个计算机就是(网页)服务器。

在终端中按下按键时发生了什么

假设你在适用一台Linux的终端,并在键盘上敲了一个按键d,这样在屏幕上就会出现一个 d。

你可能猜想到你的终端会实时显示你输入的字符,而这些与主机没有关系,事实上 不是 这样。

当你按下d时,终端向主机发送一个信号,大致是“用户刚刚输入了一个d”;主机会回复终端:“在屏幕上显示一个d”,于是在屏幕上就有了一个d。

这种情况下称主机将字符回显(echo)到了屏幕上。

在终端与主机连接良好的情况下,速度之快就好像输入设备直接连接到输出设备上一样。

当连接较差时,即便多次按下d,屏幕上也没有字符显示,终端可能会发出“哔~”或者“冰~”的声音来提示。

git文件的操作

什么是git仓库?

让我们来重温一下三个区域的概念:

git有三个工作区域:工作目录(Working Directory),暂存区(Staging Area)和git仓库(.git directory)(Repository)。

在每个git项目的根目录下,都会有一个.git目录,这个目录就是git仓库。暂存区是git仓库中的一个文件(index文件),它保存着下次要提交到git仓库的文件列表。

作为分布式版本控制系统,git中的git仓库被保存在每一份项目文件中,而没有中央服务仓库。

我们平时工作的地方,也就是项目的文件夹,叫做工作目录。

一个git仓库包括:

  • 一系列提交对象(commit objects).
  • 一系列指向这些提交对象的索引,叫做heads。

一个提交对象(commit objects)包括:

  • 一系列文件在某个时间的快照。
  • 一系列指向父提交对象的索引。
  • 一个SHA-1名字,这个名字40个字符长,是独一无二的。
  • 作者的姓名和邮箱,以及提交时对提交的描述。

用户在修改完版本A后提交得到版本B,版本A就是版本B的父提交对象。一个提交对象可以有多个父提交对象。

整个项目中的第一个提交对象没有父提交对象。

总的来说,git仓库包含很多提交对象,并且每个提交对象都指向自己的父提交对象,直到第一个提交对象。

head与HEAD

head只是一个指向提交对象的索引,每一个head都有一个名字。git默认有一个叫做master的head。一个git仓库可以有多个head。

在任何时候,当前使用的head的别名叫作HEAD

每一次提交之后,HEAD都会自动地从父提交对象指向本次提交对象。

综上所述,git仓库的示意图如下:

git仓库

在提交之后,会生成新的提交对象,并且HEAD会指向新的提交对象。

修改了什么?git diff [–staged]

现在将README.txt文件中的最后一行Git is very fast.修改为Git is very fast and convenient.可以得到如下结果:

 git diff diff --git a/README.txt b/README.txt index f3401b9..a695b86 100644 --- a/README.txt +++ b/README.txt @@ -1,3 +1,4 @@  Hi, Git!  Git is a free and open source distributed version control system.  Git is very easy to learn. +Git is very fast and convenient.  git add README.txt 
 git diff  

可见,git diff将工作目录中现在的文件状态同暂存区中的文件相比较。如果要比较暂存区中下次要提交文件同已提交文件的更改,可以使用git diff --staged命令,这个命令会比较HEAD指向的文件版本与暂存区中的版本的区别(git diff --cached是此命令的老用法):

$ git diff --staged
diff --git a/README.txt b/README.txt
index f14261d..a695b86 100644
--- a/README.txt
+++ b/README.txt
@@ -1,2 +1,4 @@
 Hi, Git!
 Git is a free and open source distributed version control system.
+Git is very easy to learn.
+Git is very fast and convenient.

就像之前所说,_HEAD_指向当前的提交对象,因此git diff HEAD -- README.txt可以比较当前git仓库中的文件版本和工作目录中的文件版本。

移除文件 git rm [-f | –cached]

如果要从已被跟踪的文件列表中删除某个文件,可以使用git rm命令,它会同时删除工作目录中的文件。如果文件已经被修改并且纳入暂存区,那么需要使用-f选项。下面是一个例子,省略了部分输出:

 touch a.txt  git add a.txt
 git commit -m "add a.txt"  ls
a.txt  README.txt
 git rm a.txt rm 'a.txt'  git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    a.txt

 git commit -m "delete a.txt"  ls
README.txt

如果仍然需要在工作目录中使用该文件,而不想被跟踪,可以使用--cached选项。

 touch b.txt  git add b.txt
 git commit -m "add b.txt"  git rm --cached b.txt
 git commit -m "delete cached b.txt"  git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    b.txt

nothing added to commit but untracked files present (use "git add" to track)

重命名文件 git mv

使用git mv命令对文件进行重命名:

 git mv README.txt README.md  git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.txt -> README.md

忽略文件 .gitignore

项目中可能有一些文件不需要,或者不应该被git跟踪,比如私人配置文件、日志文件、临时文件等。这时候就用到了.gitignore文件,最好在项目一开始就配置好这个文件,以免将来错误的提交此类文件。.gitignore文件中记录的文件列表不会被git跟踪。

现在以a.txt为例,将它加到.gitignore文件中:

 echo "a.txt" >> .gitignore  git add .gitignore ; git commit -m "add a.txt to .gitignore"
 touch a.txt  git status
On branch master
nothing to commit, working directory clean

可见,虽然a.txt是新的文件,但是git却现实工作目录是干净的,原因就是a.txt被加到了.gitignore中。

.gitignore文件的语法如下:

  • 开头的行表示注释,都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

标准的glob模式指的是:

  • *表示匹配零或者任意多个任意字符;
  • [abc]表示匹配括号中的任意一个字符,此例表示比配一个a,或者一个b,或者一个c。
  • ?表示匹配任意一个字符;
  • 方括号中用短线表示断线两端内的字符会被匹配,[0-9]表示会匹配0至9之间的数字。
  • **表示任意中间目录,比如a/**/z匹配a目录中的z文件,中间可以有零至多级目录。

下面的例子来自《Pro Git》(written by Scott Chacon and Ben Straub and published by Apress)书籍,2.2节,遵循Creative Commons Attribution Non Commercial Share Alike 3.0 license协议。我对原本例子进行了翻译。这是一个.gitignore文件的例子:

# 忽略 .a 文件
*.a 

# 跟踪 lib.a, 即使在上一句中已经忽略了 .a 文件 
!lib.a 

# 仅仅忽略本目录的 TODO,不要忽略子目录的 TODO
/TODO 

# 忽略 build 目录中的所有文件
build/ 

# 忽略 doc/notes.txt, 但会跟踪 doc/server/arch.txt 
doc/*.txt 

# 忽略所有的 doc/ 目录中的 .pdf 文件
doc/**/*.pdf

GitHub上有数十种语言的.gitignore文件,请移步 https://github.com/github/gitignore。

戒掉手机一个星期

2017年末尾的一段时间,为了考研,我在图书馆学习时不带手机,只有在中午和晚上在宿舍的时候才用一下。

我觉得如果真的认真的做一件事情,是一件非常享受的事情。手机会无时无刻地企图干扰我的生活,如果我带手机的话。不带手机的时候,我发现自己能做很多事情,而且很连贯,是一种安稳的感觉。

有句话说:专注是一种美德。我深表认同。

git文件状态,暂存与提交

git中文件的状态有两种:已跟踪或者未跟踪。

从现有目录中创建git仓库 git init

git仓库(repository),也叫做版本库。使用git的目的是管理项目,并且保存一些随时间变化的文件。git使用git仓库来保存这些信息。

git仓库作为一个目录保存在项目目录中,目录名为 .git。作为一种分布式版本控制工具,git仓库中包含了项目的所有被记录信息。

在目录中,使用 $ git init 命令创建git仓库。

下面的例子在 /home/wm/project/wm_git_book/ 目录下创建了git仓库,即项目目录 wm_git_book 开始由git进行版本控制。

$ git init
Initialized empty git repository in /home/wm/project/wm_git_book/.git/

命令后的提示说明在指定位置创建了一个空仓库。现在 wm_git_book 目录中有了一个 .git 目录,这就是git仓库。

使用同样的命令也可以在已经存在文件的目录中创建仓库。

文件的状态:跟踪与未跟踪、文件状态变化情况

被git管理的工作目录中的文件无非两种状态:已跟踪或者未跟踪。

已跟踪的文件是指那些被git管理的文件,在上一次快照中有他们的记录。已跟踪的文件可的状态能是未修改的、已修改的或者已暂存的。

工作目录中除了已跟踪的文件,其余全是未跟踪的文件。

初次克隆某个仓库的时候,工作目录中所有文件都是已跟踪未修改状态。修改了某些文件后,进行暂存和提交,如此反复。

使用git时文件状态变化情况如下:

file_status

查看状态 git status

如果要查看文件的状态,可以使用 git status 命令。

$ git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)

git告诉我们,目前在 master 分支,或者说主分支。主分支是每一个使用git管理的项目的默认分支。

git还告诉我们,目前没有要提交的内容,并且提示我们用 git add 将文件进行跟踪。

现在我们来创建一个 README.txt 文件,内容如下:

Hi, git!

现在用 git status 查看一下状态:

$ git status
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README.txt

nothing added to commit but untracked files present (use "git add" to track)

git告诉我们,工作区中有一个修改的文件 README.txt,它是未跟踪文件。git 不会 自动跟踪文件,跟踪新的文件需要手动操作,这样可以避免二进制或者其他不想跟踪的文件被跟踪。

暂存与提交 git add, git commit [-ma]

使用 git add 跟踪一个文件,并且将其纳入暂存区。git add使用文件或者目录作为参数,如果参数是目录,那么会递归地跟踪该目录下左右文件。下面将跟踪 README.txt 文件:

$ git add README.txt

没有提示就是好提示。再次使用 git status 查看状态:

$ git status
On branch master
Initial commit
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   README.txt

可见,此时 README.txt 已经被暂存(staged),并且作为下次提交(commit)的新文件。

使用 git commit 对暂存的文件进行提交,提交之后文件就会被保存在git仓库中。使用前请确定所有需要提交的文件都已经 git add 过,使用方法如下:

$ git commit -m "Add README.txt"
[master (root-commit) bf47a4f] Add README.txt
 1 file changed, 1 insertion(+)
 create mode 100644 README.txt

git commit-m选项让用户将提交命令和信息在一行写完。上面的Add README.txt是用户对本次提交的说明,即提交信息。提交内容是暂存区的内容,提交后,系统会显示本次提交的分支(master)、完整SHA-1校验和(bf47a4f)以及文件的更改。

提交的文件是已经添加到暂存区的文件快照,在工作目录中未添加到暂存区的文件不会被提交。已经添加到暂存区的文件,但是在工作目录中被修改,而没有再次添加到暂存区,提交的是暂存区中的文件快照。

如果确实有很多提交信息要写,可以直接使用git commit命令,执行命令后,结果如下:


# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # new file: b.txt #

其中第一行是填写提交信息的地方,所有已#开头的行都是注释,可以删除掉,也可以保留。默认注释行写了分支和文件情况。使用git config --global core.editor来设置你喜欢的编辑软件。

暂存区可以让用户精心的准备需要提交的文件,但是有时候也会略微繁琐。如果不想通过暂存区而直接提交,可以使用git commit -a命令。这个命令可以将所以已经跟踪过的文件暂存起来一并提交,而不用git add。已经跟踪的文件是指该文件被git管理,表现为暂存区或者git仓库中有该文件的快照。

现在修改README.txt的内容,在文件末尾添加一行git is a free and open source distributed version control system.,然后使用-a选项提交。

 cat README.txt  Hi, git! git is a free and open source distributed version control system.  git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.txt

no changes added to commit (use "git add" and/or "git commit -a")
 git commit -a -m "Add a description to git in README.txt" [master 8307318] Add a description to git in README.txt  1 file changed, 1 insertion(+)  git status
On branch master
nothing to commit, working directory clean

可以看到,README.txt作为一个已经被跟踪的文件,在修改后不使用git add添加到暂存区,而直接使用git commit -a就可以提交。

暂存已修改的文件、状态简览 git status -s

现在在README.txt末尾补充一句:git is very easy to learn.。并且把它加到暂存区。

 cat README.txt  Hi, git! git is a free and open source distributed version control system. git is very easy to learn.  git status 
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.txt

no changes added to commit (use "git add" and/or "git commit -a")
 git add README.txt   git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
wenjain
    modified:   README.txt

README.txt是被跟踪的文件,在修改之后,它的状态是:已经修改,还没有暂存。然后将它添加到暂存区。可见,git add既可以用来跟踪新的文件,亦可以将已经跟踪的文件添加到暂存区。git add的作用是将文件添加到暂存区,暂存区是下一次提交的文件,因此git add也可以理解为将此文件作为下次提交的文件。

再次修改README.txt,在其末尾添加git is very fast.。再次查看状态。

 cat README.txt  Hi, git! git is a free and open source distributed version control system. git is very easy to learn. git is very fast.  git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   README.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.txt


出现了两个README.txt,其中一个是待提交(在暂存区),一个是未暂存(在工作目录)。这个现象的原因是git暂存区只保存了文件在执行git add时的版本,如果此时提交,则只会提交文件被最后一次git add时的快照,而不是在工作目录中的当前版本。

现在运行git status -s可以得到下面的结果:

$ git status -s
MM README.txt

git status -s会显示简单的状态,在上面的例子中README.txt的左边的M表示该文件被修改了并且已经放入了暂存区,右边的M表示被修改了但是还没有放入暂存区。下面是一个输出样本:

$ git status -s 
MM README.txt 
 M makefile 
A  xxx.txt
M  aaa.c 
?? LICENSE.txt

README.txt在修改后添加到暂存区,又被修改之后未加入暂存区。makefile被修改了但未加入暂存区。A标记的xxx.txt表示该文件是第一次被加入到暂存区。aaa.c被修改后加入暂存区,并且未再次被修改。??标记的LICENSE.txt表示该文件未被跟踪。

只有我觉得旺仔牛奶难喝

今天去买了一瓶旺仔牛奶,然后喝了。

喝了一口,真的好难喝啊!

天呐,牛奶不像牛奶,调制乳不像调制乳。

真的,差点吐了。

然后去网上一搜,奥哟,都是说好喝的……

wantwant_milk

吃一次主席套餐

  • 2013年12月28日,习近平总书记在北京庆丰包子铺月坛店购买的午餐。
  • 该午餐包括二两猪肉大葱包子6个,一碗炒肝,一盘芥菜。

  • 我去庆丰包子铺大钟寺店吃的(2017-09-11)。

  • 习主席胃口不错。

主席套餐

101件事儿

  • 把一款电脑游戏打通
  • 动眉毛
  • 开通自己的博客
  • 学习游泳
  • 在公共场所闹笑话
  • 参与选举、投票
  • 游玩故宫
  • 瞻仰毛主席
  • 人民大会堂听宣讲
  • 赢得一个奖项
  • 学习莫斯密码
  • 当一周素食主义者
  • 学习一门MOOC并取得证书
  • 吃一次主席套餐
  • 戒掉手机一个星期
  • 赢得制胜一分
  • 捐款100元并收到发票
  • 写一篇京剧入门文章
  • 献血
  • 加入快闪族
  • 跑一场马拉松
  • 漂流瓶传递信息
  • 在扶梯上逆行
  • 记录梦境
  • 摸一些恐惧的生物
  • 做好出名的准备
  • 做一幅好看、好用的日历
  • 学习吹口琴
  • 去鬼屋
  • 设计一件T恤
  • 在国庆节去天安门广场看升旗
  • 养活一株花
  • 使用布袋购物
  • 爬泰山
  • 学习煎鸡蛋
  • 为一首歌填词
  • 只用左手打字
  • 养一只猫或者狗
  • 假装自己是售货机
  • 安装一次Gentoo Linux
  • 写C语言教程
  • 写一个Linux内核
  • 参加GSOC
  • 组建一支乐队
  • 乘坐热气球升空
  • 在火山前拍照
  • 观赏极光
  • 体验玻璃栈道
  • 学习抖空竹
  • 学习瑜伽
  • 参加电视节目
  • 去看Taylor Swift的现场演出
  • 大肆清理旧货
  • 去哈尔滨玩冰雕
  • 在花园种地
  • 把钱粘在地上看会不会有人捡
  • 上某个报纸、杂志或者期刊
  • 写作并出版一本书
  • 用自己名字命名某个东西
  • 涂鸦
  • 认识一个和自己同名的人
  • 收藏金光灿灿的5角硬币
  • 创造或者更新一项吉尼斯世界记录
  • 8种不同姿势
  • 一场完美的性爱
  • 观看火箭发射
  • 当一次人体小白鼠
  • 跳伞
  • 入住五星级总统套房
  • 到访中国所有省份
  • 到太空去
  • 辞掉厌恶的工作
  • 建一个所有人都会感兴趣的网站
  • 报复
  • 当一回群众演员
  • 忏悔
  • 活到100岁
  • 找到老婆并一辈子不离婚
  • 把基因延续下去

一周素食主义者

  • 对一些肉食主义者很难;
  • 天气炎热有益于完成此任务;
  • 肉食摄入的减少会增加主食的摄入。
日期 早餐 中餐 晚餐
17-05-16 豆浆、芹菜包 西红柿鸡蛋刀削面 蛋炒饭
17-05-17 小米粥、芹菜包 酸豆角粉 茄子、土豆、馒头、饼
17-05-18 胡萝卜包、白菜包、小米粥 麻酱凉面 蛋炒饭
17-05-19 豆腐脑、烧饼、鸡蛋 馒头片、烧饼、豆芽菜 韭菜鸡蛋饺子、鸡蛋手抓饼
17-05-20 土豆包、豆腐脑、鸡蛋 韭菜鸡蛋饺子、鸡蛋手抓饼
17-05-21 芹菜包、豆腐脑 蛋炒饭
17-05-22 土豆包子、豆腐脑 凉面