气象家园投稿第三篇:vi 与环境变量
熟悉了 Linux 的一些基本操作以后,差不多就可以正式用它来进行工作了,那么平时主要在 Linux 上做些什么呢?根据自己的经历,我想大概有以下几点吧:
- 管理文件(或者说管理系统?)
- 编写程序(应该大多是 Fortran 语言吧)
- 软件使用(如 NCL、Matlab)
- 模式使用(多在服务器上运行)
之后几篇的内容大致也就是关于这几个方面的。先说说管理文件,可以很简单,比如我备份几个数据、归类几个文件夹,就是对我的文件进行了管理;也可以相对更为复杂,比如我查看一下系统信息的文件,修改一下配置文件,使得我的系统用起来更加符合我自己的习惯。就泛泛地说“管理”这个词,它包含的内容是很多的,对于普通用户和管理员用户,“管理”又具有不同的含义。不过我可没法聊这些,但有必要介绍下文本编辑器,因为不知道怎么编辑文件,怎么能进行管理呢(点头
vi
在 Linux 下,如果你想查看一个文本文件的内容,可以通过多种方式来实现。下面这5个命令均能查看文件内容:cat
,more
,less
,head
,tail
。如:1
[N@Dell ~]$ cat readme
其中 cat
会显示所有内容,more
和 less
是分页显示(区别在于 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 一共有三种模式:一般模式、编辑模式、命令行模式。一般模式是刚打开文件后所进入的模式,可以进行移动光标、删除字符、复制粘贴等操作。在一般模式下若按下 i
,o
,a
等按键后将进入编辑模式,此时可以对文件内容自由编辑,按下 Esc
则退出到一般模式。在一般模式下若按下 :
,/
,?
等按键(:
即 shift+;
),则进入到命令行模式,该模式下可以执行查找、替换、保存、退出等操作。下面简单列举下三种模式下的常用操作:
一般模式:h
,j
,k
,l
或 ←
,↓
,↑
,→
:光标的移动[Ctrl]+f
,[Ctrl]+b
或 [Page Down]
,[Page Up]
:向下/向上翻页0
,$
或 [Home]
,[End]
:行首/行尾n[space]
:向右移动 n 个字符,[space] 为空格键nG
:移动到第 n 行,只按 G 则移动到最后一行,gg(相当于 1G)为移动到第一行n[Enter]
:向下移动 n 行x
,X
:向后/向前删除一个字符dd
,ndd
:删除当前行/向下删除 n 行dw
:删除当前单词yy
,nyy
:复制当前行/向下复制 n 行p
,P
:将已复制的内容粘贴到光标的下一行/上一行u
,[Ctrl]+r
:撤销/恢复撤销.
:重复上一个操作v
,V
,[Ctrl]+v
:块选择,选取后用 y 和 d 来复制和删除
一般模式切换至编辑模式:i
,I
:插入模式,i 从当前光标插入,I 从行首插入a
,A
:插入模式,a 从当前光标前插入,A 从行尾插入o
,O
:插入模式,o 从下一行插入新行,O 从上一行插入新行r
,R
:替换字符,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
:向下查找/向上查找n
,N
:进行查找后,寻找下一个/上一个匹配项: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
,不过像 HOME
、SHELL
、LANG
、HISTSIZE
和 LD_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
了,甚至连 ls
、cp
等等也没用了,因为你的 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
),其内容大致如下:
上一期提到过把 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
差不多嘛!不过 alias
和 PATH
确实是两回事,起码后面的路径不相同(alias
是写出了 hello
的完整路径,PATH
里只写到文件夹),但最主要两者基本概念就不同,大家慢慢体会吧。
基本上 .bashrc
文件里就是设置 alias
和环境变量了吧,不过以后有什么特殊需求的话,也可能会在 .bashrc
里面写入其他的语句(如图中的 ulimit ...
)。
对了,图里的 source
命令是啥?其实和 export
一样也是用来设置环境的,搜一下就懂咯~
有的机器上只有 .kshrc
没有 .bashrc
??那就修改 .kshrc
呗!
结语
这一期的内容其实涉及到 shell 及 shell script 的学习,不过它也挺复杂的,我只能从很浅的层面稍微介绍介绍。建议有时间可以多看看 shell 与 shell script 的内容,真的很重要!