• shell 初探


    我要看大佬写的代码,但是他运行就是那.sh文件运行,

    有这么个语句:./run_nts.sh 1 gcn_cora.cfg 。看不懂,啥东西,后来查了后缀,原来.sh为后缀的就是传说中的脚本,于是我们来了解一下脚本是啥

    我觉得大佬的这个代码使用脚本的目的就是为了方便运行调试代码,

    我的目的也是如何会使用脚本来调试代码,于是,开始吧:


    摘录网上的一段对于脚本用法的解释:

    脚本其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。 


    我是Ubuntu 20.04 系统 代码在VSCode上编写的 

    国际惯例打开菜鸟教程Shell 教程 | 菜鸟教程

    1. 啥是shell :

    Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

    业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。

    2. 用shell写一个简单的hello world demo :

    打开VSCode,新建一个文件夹:"代码尝试"。在文件夹中新建一个文件,命名以.sh为结尾,表明这是一个shell文件

    (不用配置环境,啥也不用干)

    然后在这个.sh文件中写入两行代码:

    1. #!/bin/bash
    2. 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 告诉系统说,就在当前目录找。

    3. shell的注释:

    单行注释:前面加一个#

    4. 用命令行执行shell 如何传递参数:

    $k : k代表第k个参数

    1. #!/bin/bash
    2. echo "文件名:$0"
    3. echo "第一个参数:$1"
    4. 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中使用 " . " 和  " ./ " 执行的区别

    linux——shell中“.” 和 “./”执行的区别_Noven-zh的博客-CSDN博客_shell中.

  • 相关阅读:
    NEFTune: 通过简单的噪声提升指令精调效果
    润和软件携OpenHarmony亮相全国首场华为云云商店·星品推介会
    5自由度雄克机械臂仿真描点
    SpringMVC中@RequestParam和@RequestBody有什么区别呢?
    【论文笔记】A Survey on Federated Learning: The Journey From Centralized to Distributed On-Site Learning and Beyond(综述)
    每天一个数据分析题(二百九十)——直方图与条形图
    Yolov5进阶之六目标追踪环境搭建
    大数据ClickHouse(十一):MergeTree系列表引擎之AggregatingMergeTree
    Spring Boot自动配置原理懂后轻松写一个自己的starter
    pnpm---高性能的npm
  • 原文地址:https://blog.csdn.net/qq_41764621/article/details/126931912