Linux 入门教程——vi 与环境变量

气象家园投稿第三篇:vi 与环境变量

熟悉了 Linux 的一些基本操作以后,差不多就可以正式用它来进行工作了,那么平时主要在 Linux 上做些什么呢?根据自己的经历,我想大概有以下几点吧:

  1. 管理文件(或者说管理系统?)
  2. 编写程序(应该大多是 Fortran 语言吧)
  3. 软件使用(如 NCL、Matlab)
  4. 模式使用(多在服务器上运行)
    之后几篇的内容大致也就是关于这几个方面的。先说说管理文件,可以很简单,比如我备份几个数据、归类几个文件夹,就是对我的文件进行了管理;也可以相对更为复杂,比如我查看一下系统信息的文件,修改一下配置文件,使得我的系统用起来更加符合我自己的习惯。就泛泛地说“管理”这个词,它包含的内容是很多的,对于普通用户和管理员用户,“管理”又具有不同的含义。不过我可没法聊这些,但有必要介绍下文本编辑器,因为不知道怎么编辑文件,怎么能进行管理呢(点头

vi

在 Linux 下,如果你想查看一个文本文件的内容,可以通过多种方式来实现。下面这5个命令均能查看文件内容:catmorelessheadtail。如:

1
[N@Dell ~]$ cat readme

其中 cat 会显示所有内容,moreless 是分页显示(区别在于 more 只能向下滚动而 less 可以上下滚动),head 显示开头部分,tail 显示结尾部分。具体用哪个命令在于你自己,不过有个常用的用法是:

1
[N@Dell Temp]$ tail -f log

tail 会显示文件结尾部分的内容,而 -f 选项(或 --follow)会实时更新文件内容。意思就是,比如你在运行一段程序,该程序将一些信息写到文件 log 里面,如果只是 tail log,则会显示到该命令为止的 log 文件中的内容,而实际上你的程序还在不断写新信息到 log 里。使用 -f 选项让你可以一直看到新的信息,而不用每隔一段时间就敲一次 tail log
但这5个命令只是查看文本文件的内容,并不能写东西到文件。这时就需要文本编辑器了,比如 vi,Emacs,nano 等等。我想介绍一下 vi,毕竟它有着不可撼动的地位,而且我也是用 vi 用习惯了,懒得去接触其他编辑器了(憨笑
先用 vi 打开已存在的文件,或者新建文件:

1
[N@Dell Temp]$ vi new

new 已存在,则会打开 new 这个文件,若 new 不存在,则新建一个文件名为 new 的文件。vi 一共有三种模式:一般模式、编辑模式、命令行模式。一般模式是刚打开文件后所进入的模式,可以进行移动光标、删除字符、复制粘贴等操作。在一般模式下若按下 ioa 等按键后将进入编辑模式,此时可以对文件内容自由编辑,按下 Esc 则退出到一般模式。在一般模式下若按下 :/? 等按键(:shift+;),则进入到命令行模式,该模式下可以执行查找、替换、保存、退出等操作。下面简单列举下三种模式下的常用操作:
一般模式:
hjkl:光标的移动
[Ctrl]+f[Ctrl]+b[Page Down][Page Up]:向下/向上翻页
0$[Home][End]:行首/行尾
n[space]:向右移动 n 个字符,[space] 为空格键
nG:移动到第 n 行,只按 G 则移动到最后一行,gg(相当于 1G)为移动到第一行
n[Enter]:向下移动 n 行
xX:向后/向前删除一个字符
ddndd:删除当前行/向下删除 n 行
dw:删除当前单词
yynyy:复制当前行/向下复制 n 行
pP:将已复制的内容粘贴到光标的下一行/上一行
u[Ctrl]+r:撤销/恢复撤销
.:重复上一个操作
vV[Ctrl]+v:块选择,选取后用 y 和 d 来复制和删除
一般模式切换至编辑模式:
iI:插入模式,i 从当前光标插入,I 从行首插入
aA:插入模式,a 从当前光标前插入,A 从行尾插入
oO:插入模式,o 从下一行插入新行,O 从上一行插入新行
rR:替换字符,r 只替换一个字符,R 一直替换
cw:替换单词,类似于 dw+i
命令行模式:
:w:w!:保存/强制保存
:q:q!:退出/退出但不保存
:wq:保存且退出
:set nu:set nonu:显示行号/不显示行号
:!command: 暂时离开 vi 执行命令 commad
:sh[Ctrl]+d:暂时离开 vi 执行多条命令,[Ctrl]+d 则回到 vi
/word?word:向下查找/向上查找
nN:进行查找后,寻找下一个/上一个匹配项
:n1,n2s/word1/word2/g:在第 n1 和 n2 行间查找 word1,并替换成 word2
:n:N:files:打开多个文件时(如 vi file1 file2),切换或显示不同的文件,
基本上常用到的就是这些了,更多的内容可以自己找找书上的内容,我这里列举的就当作是一个快速检索页面吧。当然你也可以自己学习 Emacs,不过总归是要学好一款编辑器的,有了它才能做很多事情啊,具体使用哪个编辑器就是你的自由啦!

环境变量

相信大家应该接触过环境变量了,那就是 Windows 下安装 GrADS 时,最后需要 set path,才能正常使用。如果你还记得的话,就是在系统高级设置里面找到环境变量,然后在 Path 那个变量后面加上你装的 GrADS 的路径,这样你在 cmd 里面敲 grads 就可以运行它了。不过也许你还是不太了解什么叫环境变量?
总的来说 Linux 下的变量可分为环境变量和自定义变量。简而言之,自定义变量由用户定义,环境变量则由系统来定义。那变量有什么用呢?举个例子,当我们需要重复输入一个长路径的时候,可以通过自定义一个变量保存该路径,以达到减少输入量的目的:

1
2
3
4
[N@Dell ~]$ workdir=/home/N/Temp/solve_equation
[N@Dell ~]$ cd $workdir
[N@Dell solve_equation]$ pwd
/home/N/Temp/solve_equation

这里定义了变量 workdir,调用这个变量内容时需要用到 $workdir 或者 ${workdir} 的形式。这样就不用每次输入一长串路径了。而环境变量,则是系统定义的一系列与操作环境有关的变量,在命令行敲入 env 即可查看所有环境变量:

1
[N@Dell solve_equation]$ env

当你使用 Linux 时,可能神不知鬼不觉地就用到了这些环境变量。我感觉其中关注较多的是 PATH,不过像 HOMESHELLLANGHISTSIZELD_LIBRARY_PATH 等等也含有重要的信息啦,但这里重点要说的还是 PATH 以及 .bashrc 文件。对了,如果你想查看某个变量的值,可以这样:

1
[N@Dell ~]$ echo $PATH

PATH

Windows 下不设置 Path 将无法在命令行直接运行 grads。Linux 也一样,实际上 PATH 这个变量包含了执行文件的查找路径。当你敲入某个命令如 vi 时,系统会在 PATH 提供的路径里去找,看是否存在 vi 这个程序。如果找不到,那就无法运行 vi 咯,你可以试试这样的操作:

1
[N@Dell ~]$ export PATH=

然后你会发现不能运行 vi 了,甚至连 lscp 等等也没用了,因为你的 PATH 没有值了,不过别急,重新打开终端就恢复了。
PS:一般设置自定义变量时直接写成 var=... 的形式,环境变量的修改则写成 export var=... 的形式。
简单来说,设置 PATH 使得你直接敲入命令名就能执行该命令,而不用敲命令的路径。前面将 PATH 设为空值以后,虽说敲 vi 没用,但你可以敲 /usr/bin/vi 啊!另一方面,你自己写了个 hello,你也可以把它的路径加到 PATH 里面,这样就能直接敲 hello 了:

1
2
3
[N@Dell ~]$ export PATH=$PATH:/home/N/Temp
[N@Dell ~]$ hello
Hello world!

需要说明的是,PATH 里的路径是执行文件所在文件夹,这里我在 PATH 里加上 /home/N/Temp 后,/home/N/Temp 下的所有执行文件都可以通过直接敲入程序名的方式来执行了。你不能把路径直接写到程序名,比如这样:

1
2
3
[N@Dell ~]$ export PATH=$PATH:/home/N/Temp/hello
[N@Dell ~]$ hello
bash: hello: command not found...

让我们来设想另一个情景,当我们使用服务器时,由于是多个用户在使用,服务器上装了很多的软件,但是并不是所有软件都是你需要的。实际情况是,管理员只是负责把软件装好,至于谁想用,那就把要用的软件的路径加到你的 PATH 里,这也意味着每个用户的 PATH 的内容是不同的。再比如,服务器上某个软件装了好几个版本,而你由于兼容性问题要用老版本的软件,那也得把 PATH 里面该软件的路径改为老版本的路径。

.bashrc文件

另一个要说明的就是 .bashrc 文件了, .bashrc 文件相当于是“登录时自动设置”的脚本,免去了每次登录重新设置各种变量的麻烦。该文件位于用户家目录下(如 /home/N/.bashrc),其内容大致如下:
pic_1.png
上一期提到过把 hello 的路径放到这个文件里,可以由程序名来直接运行程序。实际上是将前面提到的 export PATH=$PATH:/home/N/Temp 直接写到 .bashrc 文件中,这样就能在登录时自动设置 PATH,那么登录后就可以直接敲 hello 来运行它了。
~/.bashrc 文件里还可以对别名进行设置,即 alias ... 。这可是很好用的一个功能,只需要设置一个简称,就可以方便操作。在命令行下演示 alias 的用法:

1
2
3
[N@Dell ~]$ alias "hello=/home/N/Temp/hello"
[N@Dell ~]$ hello
Hello world!

这里是通过设置 alias 来直接运行 hello 的,看起来设置 alias 和设置 PATH 差不多嘛!不过 aliasPATH 确实是两回事,起码后面的路径不相同(alias 是写出了 hello 的完整路径,PATH 里只写到文件夹),但最主要两者基本概念就不同,大家慢慢体会吧。
基本上 .bashrc 文件里就是设置 alias 和环境变量了吧,不过以后有什么特殊需求的话,也可能会在 .bashrc 里面写入其他的语句(如图中的 ulimit ...)。
对了,图里的 source 命令是啥?其实和 export 一样也是用来设置环境的,搜一下就懂咯~
有的机器上只有 .kshrc 没有 .bashrc??那就修改 .kshrc 呗!

结语

这一期的内容其实涉及到 shell 及 shell script 的学习,不过它也挺复杂的,我只能从很浅的层面稍微介绍介绍。建议有时间可以多看看 shell 与 shell script 的内容,真的很重要!