仅掌握之前提到的最常用命令是不够的,比如就编译WRF模式来说,其中可能涉及到解压缩,权限修改,文件链接,环境变量。当然,如果编译之前不确定空间是否足够,就需要查看磁盘空间。而在编译的时候又会有一些需求,比如想后台编译,为了便于查错需要将编译输出信息保存,而不是输出到屏幕等等。
下文将以编译WRF模式的流程讲一下所涉及的命令:
下载好WRF模式源代码之后,需要将其解压:
tar -zxvf WRF3.8.tar.gz
# -z 表示解压 gzip 压缩的文件,通常就是后缀为 .tar.gz
# 针对 bzip2 压缩的文件使用 -j 选项,即后缀为 .tar.bz2
# -x 表示提取,即解压
# -v 表示输出解压过程的信息
# -f 表示档案名,解压时就是要解压的文件名,压缩时就是压缩后保存的文件名
关于使用 tar 命令解压缩的参数选择,可以查看详细帮助 tar --help
如果想要压缩一些文件的话,可以这样做:
tar -zcvf WRFV3.tar.gz WRFV3/
# -c 表示创建压缩文件,其余选项同解压缩
# 上述表示将 WRFV3/ 文件夹压缩到 WRFV3.tar.gz 中
除此之外,还有一些其他的解压缩命令,比如:
针对 *.gz 的可以使用 gzip
*.Z 使用 uncompress 解压,compress 压缩
*.zip 使用 unzip 解压,zip 压缩
*.rar 解压缩均使用 rar 命令
*.bz2 解压缩均使用 bzip2
WRF模式的编译需要一些额外的库,编译安装好这些库之后呢,需要添加环境变量。通常每个用户家目录下都有一个隐藏文件,用来存储环境变量信息,即 .bashrc 文件。
vi .bashrc
打开文件后,添加环境变量之后保存即可。
通常环境变量均是通过 export 导入,当然除了这些也可以添加别名,或是添加一些函数。
比如添加 NCL 的环境变量(注意:= 前后不要有空格)
export NCARG_ROOT=/usr/local/tools/ncl
解压文件之后就是进入到WRFV3文件夹内,设置好环境变量之后就可以开始编译了。但是编译时可能会需要 root 权限才能执行配置及编译操作(涉及到执行及文件写入)
这可不是说在不知道密码的情况下,暴力破解啊==前提是你要有管理员权限。
在终端中执行 su/sudo 然后输入密码即可(注意:输入密码时不会显示出来,只要正常输入完整密码后按回车即可)。
说到这里,就要说一下linux中的文件所具有的访问权限问题。文件或目录的访问权限有三种:只读(r),只写(w),可执行(x),(分别对应数字4,2,1,无权限则表示0)。
比如编译时,可能就需要给 compile 以可执行权限,这时候就要更改文件或目录的访问权限,轮到 chmod 上场了。
chmod a+rw secret.txt
# a 表示针对所有用户对此文件所拥有的权限
# u 表示用户,即文件或目录所有者
# g 表示用户组,如果用g 代替 a,则表示只有该组用户才拥有此权限
# o 表示其他用户
# + 表示提高权限,降低权限用 - ,如果用 = 则表示赋予给定权限,并取消其它权限
# rw 表示读写权限, 执行权限用 x 表示
# 上述命令表示让所有用户对 secret.txt 文件都拥有读写权限,但无执行权限
当然,除了上述设置方式外,也可以用数字的方式来更改文件或目录权限。
演示之前先执行以下语句,取消所有用户及组对此文件的权限:
chmod a-rwx secret.txt
ll # 列出文件及属性,其余文件省略
---------- 1 storm users 0 5月 16 17:03 secret.txt
可以看到此文件目前没有任何权限,然后执行:
chmod 750 secret.txt
ll
-rwxr-x--- 1 storm users 0 5月 16 17:03 secret.txt
可以看到文件权限改变了,第1位 - 表示文件类型,按下不表。2-4位rwx(4+2+1=7)表示当前用户为此文件所拥有的权限,第5-7位r-x(4+1) 表示用户组的权限,第8-10位表示其他用户的权限。
要对目录批量更改权限,使用 -R 参数选项。即
chmod -R a+rw WRFV3/
额外提一下:如果想要更改文件或目录的所有者,可以使用 chown 命令。
获取权限后就可以执行编译操作了,但是编译时会输出编译信息到屏幕。编译成功了还好,如果出错了,怎么查看错误信息呢?此时就需要将编译信息输出到文件。
./compile em_real 1>compile.stdout 2>compile.stderr
./compile em_real 表示WRF编译命令,但这不是重点,可以理解成执行了一个命令,但这个命令会有输出信息。
1>compile.stdout 1表示标准输出,> 表示重定向符号,compile.stdout 表示输出文件名。整个表示上述命令的标准输出信息重定向到 compile.stdout 文件中,而且如果此文件存在,将覆盖原文件内容,如果使用 >> 重定向符号,将在原文件后添加信息,而不是覆盖。
2>compile.stderr 2表示标准错误输出, > 和 compiler.stderr 同上。
如果想要后台执行命令的话,可以直接在上述语句后加 & , 即:
./compile em_real 1>compile.stdout 2>compile.stderr &
不要问我有没有3!linux启动后默认的3种文件描述符分别是0,1,2,分别表示标准输入,标准输出,标准错误输出。输出结果默认输出到屏幕。
但是如果退出了 shell 或是注销了帐号的话,上述命令同样会终止,为了避免这种情况,可以使用 nohup 命令。即:
nohup ./compile em_real 1>compile.stdout 2>compile.stderr
如果提示说: nohup: 忽略输入并把输出追加到'nohup.out' 。 可以在上述命令之后添加重定向语句。
如果想在编译时看看编译进程,可以查看编译输出信息,可以直接使用 vi 看一下标准输出文件,或是使用 tail 命令查看输出。
tail -f compile.stdout
# -f 选项表示实时输出文件最后几行
# 如果不加 -f 选项,仅输出文件最后5行
编译成功之后呢,为了方便运行,可以将安装目录链接到家目录下。因为每次登录帐号时总是先在"家"。
链接分为软链接和硬链接。软链接仅将文件链接到另一处,不占用磁盘空间,但是硬链接会占用磁盘空间。无论是软链接还是硬链接,链接后的文件和原文件始终保持同步,即无论更改哪一个文件都会导致文件同步变化。通常仅使用软链接进行文件链接。
假设当前位于家目录下,然后执行以下语句进行文件链接:
ln -sf /model/WRF/WRFV3/ wrf
注意:wrf 前后都不能添加 / ,除非使用绝对路径,但即使使用绝对路径 wrf 之后也不能添加 /,否则会出错 。
如果在 wrf 之前添加 / ,会导致权限错误,这是因为 / 表示根目录,而在根目录创建文件需要 root 权限。 如果在 wrf 之后添加 / ,会提示说 wrf 不是一个目录。
ln -sf /model/WRF/WRFV3/ /wrf
除了链接文件之外,也可以使用别名的方式简化操作。
比如想直接进入 /model/WRF/WRFV3/,而不是每次都输入
cd /model/WRF/WRFV3/
这只有三层目录还好一些,如果目录层级多了,想想都可怕。。
为了简化这种操作,只需要在 .bashrc 中添加如下语句即可:
alias cwrf='cd /model/WRF/WRFV3/'
# cwrf 就是 = 后面 ''内的命令的别名,或者说外号也行==
# 这里的 cwrf 可以是任意名称,要不然怎么说是别名呢,谁还没几个外号
然后保存并退出,为了让环境变量生效,需执行
source .bashrc
上述的别名只是很简单的例子,为了更好的简化操作,可以根据需要设置更多的别名[注1]。
编译完成之后,想要运行一下看看效果如何。但是不知道磁盘空间还有多少,够不够存储的,运行之前先查查看:
执行下列语句可以确定磁盘的使用情况:
df -h
# -h 表示以便于人类理解的形式展示信息
df 命令仅能查看磁盘的整体使用情况,但是如果当你想查看某个具体目录时就不行了,这时可以使用 du 命令。
比如你想查看 /model/WRF/WRFV3/ 目录的占用空间:
du -sh /model/WRF/WRFV3/
# -s 表示仅显示此目录下所有文件总和
# -h 表示以便于人类理解的形式展示信息
详细使用说明不多做解释[注2-3]。
除了使用 vi 命令查看文本外,还有一些命令可以查看文本文件内容。
cat 可以输出文本文件内容到屏幕,直接输出真个文件内容,可以配合参数使用,适用于小文件。
-b 对非空行进行编号并输出
-n 对输出进行编号
-s 对多个连续空行进行合并,即只输出一个空行
cat -bs secret.txt
more 也可以输出整个文本内容,但是按页显示,但只能往后翻,不能回滚。
less 也是分页显示文本内容,但是相对 more 命令来说可以向前翻。
head 命令和 tail 命令是相对的,tail 命令显示文件尾部内容,head 可以显示文件前面的内容。
想要查看当前进程运行情况时,可以执行 top 命令,不需要使用参数。
除此之外还有其他进程查看命令,但是基本不会用到,此处不作介绍。
至此结束
关于文本检索及针对磁盘操作的一些命令,涉及内容比较多,会单独说明。
注1:https://linux.cn/article-4585-1.html
注2:https://www.maketecheasier.com/linux-df-du-commands/
注3:https://linux.cn/article-6466-1.html