前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux常用命令之进阶

linux常用命令之进阶

作者头像
bugsuse
发布2020-04-20 13:58:20
7150
发布2020-04-20 13:58:20
举报
文章被收录于专栏:气象杂货铺气象杂货铺

仅掌握之前提到的最常用命令是不够的,比如就编译WRF模式来说,其中可能涉及到解压缩权限修改文件链接环境变量。当然,如果编译之前不确定空间是否足够,就需要查看磁盘空间。而在编译的时候又会有一些需求,比如想后台编译,为了便于查错需要将编译输出信息保存,而不是输出到屏幕等等。

下文将以编译WRF模式的流程讲一下所涉及的命令:

下载好WRF模式源代码之后,需要将其解压:

  • 解压缩
代码语言:javascript
复制
tar -zxvf WRF3.8.tar.gz
# -z 表示解压 gzip 压缩的文件,通常就是后缀为 .tar.gz 
#    针对 bzip2 压缩的文件使用  -j 选项,即后缀为 .tar.bz2
# -x 表示提取,即解压   
# -v 表示输出解压过程的信息
# -f 表示档案名,解压时就是要解压的文件名,压缩时就是压缩后保存的文件名

关于使用 tar 命令解压缩的参数选择,可以查看详细帮助 tar --help

如果想要压缩一些文件的话,可以这样做:

代码语言:javascript
复制
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 文件。

代码语言:javascript
复制
vi .bashrc

打开文件后,添加环境变量之后保存即可。

通常环境变量均是通过 export 导入,当然除了这些也可以添加别名,或是添加一些函数。

比如添加 NCL 的环境变量(注意:= 前后不要有空格

代码语言:javascript
复制
export NCARG_ROOT=/usr/local/tools/ncl

解压文件之后就是进入到WRFV3文件夹内,设置好环境变量之后就可以开始编译了。但是编译时可能会需要 root 权限才能执行配置及编译操作(涉及到执行及文件写入)

  • root 权限获取

这可不是说在不知道密码的情况下,暴力破解啊==前提是你要有管理员权限。

在终端中执行 su/sudo 然后输入密码即可(注意:输入密码时不会显示出来,只要正常输入完整密码后按回车即可)。

说到这里,就要说一下linux中的文件所具有的访问权限问题。文件或目录的访问权限有三种:只读(r)只写(w)可执行(x),(分别对应数字4,2,1,无权限则表示0)。

比如编译时,可能就需要给 compile 以可执行权限,这时候就要更改文件或目录的访问权限,轮到 chmod 上场了。

代码语言:javascript
复制
chmod a+rw secret.txt
# a 表示针对所有用户对此文件所拥有的权限
#    u 表示用户,即文件或目录所有者
#    g 表示用户组,如果用g 代替 a,则表示只有该组用户才拥有此权限
#    o 表示其他用户
# + 表示提高权限,降低权限用 - ,如果用 = 则表示赋予给定权限,并取消其它权限
# rw 表示读写权限, 执行权限用 x 表示
# 上述命令表示让所有用户对 secret.txt 文件都拥有读写权限,但无执行权限

当然,除了上述设置方式外,也可以用数字的方式来更改文件或目录权限。

演示之前先执行以下语句,取消所有用户及组对此文件的权限:

代码语言:javascript
复制
chmod a-rwx secret.txt
ll  # 列出文件及属性,其余文件省略
----------  1 storm users    0 5月  16 17:03 secret.txt 

可以看到此文件目前没有任何权限,然后执行:

代码语言:javascript
复制
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 参数选项。即

代码语言:javascript
复制
chmod -R a+rw WRFV3/

额外提一下:如果想要更改文件或目录的所有者,可以使用 chown 命令。

获取权限后就可以执行编译操作了,但是编译时会输出编译信息到屏幕。编译成功了还好,如果出错了,怎么查看错误信息呢?此时就需要将编译信息输出到文件。

代码语言:javascript
复制
./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 同上。

如果想要后台执行命令的话,可以直接在上述语句后加 & , 即:

代码语言:javascript
复制
./compile em_real 1>compile.stdout 2>compile.stderr &

不要问我有没有3!linux启动后默认的3种文件描述符分别是0,1,2,分别表示标准输入,标准输出,标准错误输出。输出结果默认输出到屏幕。

但是如果退出了 shell 或是注销了帐号的话,上述命令同样会终止,为了避免这种情况,可以使用 nohup 命令。即:

代码语言:javascript
复制
nohup ./compile em_real 1>compile.stdout 2>compile.stderr

如果提示说: nohup: 忽略输入并把输出追加到'nohup.out' 。 可以在上述命令之后添加重定向语句。

如果想在编译时看看编译进程,可以查看编译输出信息,可以直接使用 vi 看一下标准输出文件,或是使用 tail 命令查看输出。

代码语言:javascript
复制
tail -f compile.stdout
# -f 选项表示实时输出文件最后几行
# 如果不加 -f 选项,仅输出文件最后5行

编译成功之后呢,为了方便运行,可以将安装目录链接到家目录下。因为每次登录帐号时总是先在"家"。

  • 文件链接

链接分为软链接硬链接软链接仅将文件链接到另一处,不占用磁盘空间,但是硬链接会占用磁盘空间。无论是软链接还是硬链接,链接后的文件和原文件始终保持同步,即无论更改哪一个文件都会导致文件同步变化。通常仅使用软链接进行文件链接。

假设当前位于家目录下,然后执行以下语句进行文件链接:

代码语言:javascript
复制
ln -sf /model/WRF/WRFV3/ wrf

注意:wrf 前后不能添加 / ,除非使用绝对路径,但即使使用绝对路径 wrf 之不能添加 /,否则会出错 。

如果在 wrf 之前添加 / ,会导致权限错误,这是因为 / 表示根目录,而在根目录创建文件需要 root 权限。 如果在 wrf 之后添加 / ,会提示说 wrf 不是一个目录。

代码语言:javascript
复制
ln -sf /model/WRF/WRFV3/ /wrf

除了链接文件之外,也可以使用别名的方式简化操作。

  • 添加别名

比如想直接进入 /model/WRF/WRFV3/,而不是每次都输入

代码语言:javascript
复制
cd /model/WRF/WRFV3/

这只有三层目录还好一些,如果目录层级多了,想想都可怕。。

为了简化这种操作,只需要在 .bashrc 中添加如下语句即可:

代码语言:javascript
复制
alias cwrf='cd /model/WRF/WRFV3/'
# cwrf 就是 = 后面 ''内的命令的别名,或者说外号也行==
# 这里的 cwrf 可以是任意名称,要不然怎么说是别名呢,谁还没几个外号

然后保存并退出,为了让环境变量生效,需执行

代码语言:javascript
复制
source .bashrc

上述的别名只是很简单的例子,为了更好的简化操作,可以根据需要设置更多的别名[注1]。

编译完成之后,想要运行一下看看效果如何。但是不知道磁盘空间还有多少,够不够存储的,运行之前先查查看:

  • 查看磁盘空间

执行下列语句可以确定磁盘的使用情况:

代码语言:javascript
复制
df -h
# -h 表示以便于人类理解的形式展示信息

df 命令仅能查看磁盘的整体使用情况,但是如果当你想查看某个具体目录时就不行了,这时可以使用 du 命令。

比如你想查看 /model/WRF/WRFV3/ 目录的占用空间:

代码语言:javascript
复制
du -sh /model/WRF/WRFV3/
# -s 表示仅显示此目录下所有文件总和
# -h 表示以便于人类理解的形式展示信息

详细使用说明不多做解释[注2-3]。

  • 查看文本文件

除了使用 vi 命令查看文本外,还有一些命令可以查看文本文件内容。

cat 可以输出文本文件内容到屏幕,直接输出真个文件内容,可以配合参数使用,适用于小文件。

-b 对非空行进行编号并输出

-n 对输出进行编号

-s 对多个连续空行进行合并,即只输出一个空行

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档