我要看大佬写的代码,但是他运行就是那.sh文件运行,
有这么个语句:./run_nts.sh 1 gcn_cora.cfg 。看不懂,啥东西,后来查了后缀,原来.sh为后缀的就是传说中的脚本,于是我们来了解一下脚本是啥
我觉得大佬的这个代码使用脚本的目的就是为了方便运行调试代码,
我的目的也是如何会使用脚本来调试代码,于是,开始吧:
脚本其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。
我是Ubuntu 20.04 系统 代码在VSCode上编写的
国际惯例打开菜鸟教程:Shell 教程 | 菜鸟教程
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。
打开VSCode,新建一个文件夹:"代码尝试"。在文件夹中新建一个文件,命名以.sh为结尾,表明这是一个shell文件
(不用配置环境,啥也不用干)
然后在这个.sh文件中写入两行代码:
- #!/bin/bash
- echo "Hello World !" #echo 命令用于向窗口输出文本
解释一下第一条语句: #!/bin/bash
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
简言之,我们常用的就是Bourne Shell 和 Bourne Again Shell 但这两者不做区分,因此用来指定脚本使用哪个解释器时,#!/bin/sh ,它同样也可以改为 #!/bin/bash
然后,运行该文件:
有两种方法:
第一种就是在VSCode中右键 -- Run Code
第二种方法是[推荐这种]:
在命令行中:首先进入该.sh所在的文件夹,我的.sh文件名为test.sh,
所以在命令行中首先键入命令1:chmod +x test.sh
然后键入命令2:./test.sh 就可以执行该条命令了
解释一下第二种方法的两条命令:
命令1 的目的是 :给我们的test.sh指令赋予一个执行权限。chmod 是 控制用户对文件的权限的命令,大致意思就是让用户可以后通过 ./XXX.sh 就可以直接执行shell脚本文件了
【补充】在ubuntu(Linux)中,如果一个文件是可执行的,它会显示的颜色是绿色。下图就是:我仅仅给test.sh执行了 chmod +x test.sh 语句,所以同为shell文件,test.sh就是绿色的,而testtt.sh文件就是白色的(不可直接执行文件)
如果我们选择直接执行:./testtt.sh ,由于我们没有对该sh文件进行赋权操作,所以会返回一个报错:bash: ./testtt.sh: Permission denie
所以需要先对sh文件进行赋权,然后再执行 ./XXX.sh
【补充】chmod +x XXX.sh命令是赋权操作 ;chmod -x XXX.sh就是去权操作(那么,很显然,去权之后的.sh文件的颜色就重新变为了白色)
【补充】chmod +x XXX.sh命令的赋权操作对于一个.sh文件执行一次就够了,只要该文件名不变,.sh文件中的内容怎么变都没关系,下次直接./XXX.sh运行即可
命令2的解释:
为什么赋权操作中不需要 ./ 而执行操作就必须加上 ./ 这个东西呢?
与运行其它二进制的程序一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的文件。但,PATH路径下,只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 路径中。我们当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的。使用 ./test.sh 告诉系统说,就在当前目录找。
单行注释:前面加一个#
$k : k代表第k个参数
- #!/bin/bash
- echo "文件名:$0"
- echo "第一个参数:$1"
- echo "第一个参数:$2"
在命令行中输入:./test.sh aa bb
输出是:
很直观可以理解,其实 `$0`就是我们命令中的 "test.sh" ,它就是作为指令中的第一个参数使用的
参数与参数之间用 空格 隔开即可
5. 这里补充一个:MVAPICH2——mpiexec使用教程
由于大佬的代码是多线程的一个实现,所以,它的shell语句的指令就是:mpiexec XXXXX
啥意思呢:
因此:run_nts.sh中的语句 :mpiexec -np $1 ./build/nts $2
配合执行该run_nts.sh脚本文件时在命令行中输入的指令:./run_nts.sh 1 gcn_cora.cfg
大致意思就是:以单节点(单机器)多线程方式执行 ./build/nts 文件,由于此时-np参数给赋值为1,那就说明是以单线程的方式执行 ./build/nts 文件。然后执行该 ./build/nts 文件时,需要的参数由 gcn_cora.cfg 文件提供
ref : MVAPICH2——mpiexec使用教程:
MVAPICH2——mpiexec使用教程_Noven-zh的博客-CSDN博客_mpiexec命令
6. linux 中在shell中使用 " . " 和 " ./ " 执行的区别