path.lastIndexOf('/') + 1); console.log(fileName); // 输出 "12.png" 代码使用了字符串操作来获取路径中的文件名...,并将结果存储在变量fileName中,然后通过console.log输出了结果。...const fileName = path.substring(path.lastIndexOf('/') + 1); 使用了字符串的substring和lastIndexOf方法来获取路径中的文件名。...+1:将最后一个斜杠的索引位置加1,以获取文件名的起始位置。 path.substring(...):substring方法截取字符串中指定范围的部分。...根据你提供的代码和路径,fileName将被赋值为"12.png",并通过console.log输出。它提取了路径中最后一个斜杠后面的部分,即文件名。
前言 实际项目中可能会有需要读取类路径下面的配置文件中的内容的需求,由于springboot项目打包的是jar包,通过文件读取获取流的方式开发的时候没有问题,但是上到linux服务器上就有问题了,对于这个问题记录一下处理的方式...类加载器的方式 通过类加载器读取文件流,类加载器可以读取jar包中的编译后的class文件,当然也是可以读取jar包中的文件流了 比如要读取resources目录下common/tianyanchasearch.json...FileUtil.getStringFromInputStream(resourcePath); return GlobalResult.succeed(JSON.parseObject(content)); /** * 从输入流中获取文件内容字符串...; } catch (IOException ex) { System.out.println("=======获取数据时...推测主要原因是springboot内置tomcat,打包后是一个jar包,因此通过文件读取获取流的方式行不通,因为无法直接读取压缩包中的文件,读取只能通过流的方式读取
如何将字符串中的子字符串替换为给定的字符串? strtr()函数是PHP中的内置函数,用于将字符串中的子字符串替换为给定的字符串。...该函数返回已转换的字符串;如果from和to参数的长度不同,则会被格式化为最短的长度;如果array参数包含一个空字符串的键名,则返回FALSE。 php strtr()函数怎么用?...规定要转换的字符串。 ● from:必需(除非使用数组)。规定要改变的字符(或子字符串)。 ● to:必需(除非使用数组)。规定要改变为的字符(或字符串)。...一个数组,其中的键名是原始字符,键值是目标字符。 返回值 返回已转换的字符串。...如果 from 和 to 参数的长度不同,则会被格式化为最短的长度;如果 array 参数包含一个空字符串("")的键名,则返回 FALSE。
四、进程程序替换 1、什么是进程程序替换 2、进程程序替换的原理 3、如何进行进程程序替换 (1)、exec 系列函数 (2)、函数命名理解 (3)、函数如何使用 五、实现一个简易的 shell...进程程序替换是指父进程用 fork 创建子进程后,子进程通过调用 exec 系列函数来执行另一个程序;当进程调用某一种 exec 函数时,该进程的用户空间代码和数据完全被新程序替换,然后从新程序的启动例程开始执行...第二个参数为如何执行我们的程序,这里我们只需要记住:在 Linux 命令行中该程序如何执行我们就如何传参 即可;需要注意的是,命令行中多个指令是以空格为分隔的一整个字符串,而 exec 中我们需要对不同选项进行分割...是通过创建子进程的方式去执行命令行中的各种指令的,也就是说,cd 命令是由子进程去执行的,那么自然被改变也是子进程的工作目录,父进程的工作目录不受影响; 而当我们使用 PWD 指令来查看当前路径时...,而是由 shell 进程本身内部的逻辑来完成;外部命令则是通过创建子进程,然后进行进程程序替换,运行外部程序文件等方式来完成。
✈️ 获取输入的命令 有了命令行解释器,我们在 shell 上还有输入命令这一行为,那么我们自定义shell就需要接收输入的命令行字符串。 ... 我们平时在shell 中输入的命令选项是不确定的,有时候有多个选项,有时候有一个选项,有时候没有选项,而shell会根据不同的选项来执行不同的动作。 ...那么如何切割字符串呢?... 前面我们学习过,程序替换成功时,后续程序就不会往下走,又因为进程之间具有独立性,所以需要创建一个子进程来完成进程替换这件事情。...export命令处理 当我们在 自定义 Shell 中导入一个新的环境变量时,也是由子进程进行程序替换完成这件事的,所以,当我们使用hell进行env时,是看不到导入的环境变量的: 所以,export
回顾一下,我们前面学习了进程创建,进程终止,进程等待,进程替换,通过这些内容我们可以来进行实现简单的shell命令行解释器!!!...下面我们直接来看一看如何去实现shell命令行解释器: 总体分为(整体需要循环哦): 1.输出提示符 2.输入和获取命令 3.fork创建子进程 4.内建命令 ---- 输出提示符 这里的提示字符为用户名...shell运行原理 同时,在理解一下shell的运行原理:shell内部提取命令行做分析,然后调用exec. shell执行命令必须通过创建子进程,如果不创建子进程会把我们所有的shell全部替换,所以执行命令时一般磁盘上的程序必须创建子进程...内建命令 我们在运行自己写的shell的时候,发现输入cd …输入cd path等命令时发现路径并没有改变!...,让shell自己执行对应的命令,本质就是执行系统接口 //像这种不需要我们的子进程来执行,而是让shell自己执行的命令 --内建 内置命令 if(myargv[0]!
前言 本文是基于前面介绍过的关于进程创建、进程终止、进程等待、进程替换等知识,尝试做的一个简单的shell命令解释器。...获取 strtok(lineCommand," "); 用strtok函数将输入的字符串切割成若干个子串; strtok函数的参数:第一次传字符串的首地址,之后传NULL即可(会从上次切割的位置继续切割...答:如果不创建子进程,而是让bash直接去执行进程,会将我们的bash直接替换为其他程序,shell就不能继续正常执行其他指令了(就回不到输入界面了)。...答:因为我们自己写的shell,执行很多命令都要用fork创建子进程,让子进程去执行。当子进程执行cd命令时,更改的时子进程的工作目录而与父进程无关,因此父进程的路径并不会发生修改。...,本文介绍了如何实现一个简单的shell解释器。
execve函数把调用它的进程的程序,替换成execve函数的参数所指定的程序。运行execve函数成功后,进程 将开始运行新的程序,也就是execve函数的参数所指定的程序。...// 注意,在argv1 的第一个字符串“/bin/ls”中,只有ls是有用的。 系统调用waitpid()用于等待子进程结束、获取子进程的运行状态,详细说明在第八章。...由于shell命令的命令名和各参数之间是用空格分开,因此可以用空格作为分界符。通过一个循环可以把buf数组中的命令和各个参数依次分离开来,并赋给数组argv的各元素适当的指针值。...一般命令都可以由fork+execvp执行,由fork创建一个子进程,调用一种exec函数时,该进程执行的程序完全替换为新程序 而新程序则从其main函数开始执行; 但要注意exec并不创建新进程,所以前后的进程...这两个函数通过open命令,将之前获取的rfile 和wfile文件打开,获取File descriptor后,再使用dup2函数重定向STDIN_FILENO和STDOUT_FILENO,open函数采用权限位为
答:因为hash值的原因,外部命令第一次执行时搜索的路径会记录在内存的hash表中 hash查看一下,会发现有/root/first.sh 清除一下:hash -d first.sh 问题: 脚本执行...则是将子进程放到父进程进行执行,将影响当前环境,常用于读取配置文件 5、bash中变量分类、 本地变量(普通变量):生效范围为当前shell,对当前shell之外的其他shell进程,包括当前shell...的子进程均无效 环境变量:生效范围为当前shell进程及其子进程(作用范围:当前shell、子shell、子子shell) 局部变量:生效范围为当前shell进程中某代码片段 位置变量:$1,$2,......来表示,用于脚本代码中调用通过命令行参数传递给它的参数 特殊变量:$?...清空位置变量 set -- 位置变量的扩展功能(执行一次,移动一位,只使用$1就好) 但我们在执行一个程序时,如何判断其是否执行完,我们可以通过shift来看看 shift N(N值很大,超过了给定变量的总数
将子进程添加到系统进程列表中,实际上是通过一张哈希表来完成的,Linux利用hash表来管理进程,指向PCB的指针会存到pidhash里面,然后在通过pid_hashfn哈希函数,将进程的pid转换为hash...fork之后,子进程如果创建成功是不需要得到父进程的pid的,因为这没有意义,他完全可以通过getppid来获取父进程的pid,所以没有必要用返回值来接收,究其原因就是,子进程找父进程具有唯一性,因为子进程只能有一个父进程...进程等待的本质就是检测子进程的退出信息,然后父进程将子进程的退出信息(退出码和终止信号等)通过status变量获取,也就是通过waitpid或wait等系统调用获取。...2.让子进程加载磁盘上指定的程序到内存中,使其执行新的程序的代码和数据,这就是进程的程序替换。...在模拟shell的实现代码中,cd到其他目录,pwd之后的路径实际上是没有变化的,因为pwd实际上pwd的是父进程shell的路径,而父进程的cwd路径始终是未改变的,而执行cd命令的是子进程,所以子进程的
SHELL:当前使用的SHELL HISTSIZE:历史命令的最大条数 MAIL:当前用户的邮箱目录 PATH:可执行文件的查找路径。...由于它是局部变量,因此子进程中无法继承这个变量,子进程拥有自己的PS1。...当前shell的PID 可以通过如下命令查看当前shell的PID: echo $$ ?...在一个bash中开启一个新的bash,那么原本的bash称为父进程,新的bash称为子进程。 子进程会继承父进程的所有环境变量,而父进程的局部变量只能在父进程中使用。...,依次向后找到第一个旧字符串,并将其替换 ${变量名//旧字符串/新字符串} 将变量值中所有的旧字符串替换成新字符串
shell变量可分为两类:局部变量和环境变量。 局部变量只在创建它们的shell中可用;而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。...对shell变量的引用方式很多,用这些方式可以方便的获取shell变量的值,变量值的长度,变量的一个字串,变量被部分替换后的值等等。...它是以冒号分隔的目录列表,shell通过它来搜索cd命令指定的目标目录。例如....:~:/usr EDITOR:内置编辑器emacs、gmacs或vi的路径名 ENV:每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc。...随机数序列可以通过给RANDOM赋值来初始化。
例如,列表中所有命令的输出可以重定向到单个流。 ( list ) 在圆括号之间放置一列命令将创建一个子shell环境,列表中的每个命令将在该子shell中执行。...由于该列表是在子shell中执行的,所以在子shell完成后,变量分配将不再有效。 { list; } 在花括号之间放置一个命令列表将导致该列表在当前shell上下文中执行。不创建子shell。...功能注释 主体脚本中除简洁明了的函数外都必须带有注释。库文件中所有函数无论其长短和复杂性都必须带有注释。 这使得其他人通过阅读注释即可学会如何使用你的程序或库函数,而不需要阅读代码。...、空格或shell元字符的字符串 在有明确要求必须使用无引号扩展的情况下,可不用引号 字符串为单词类型时才推荐用引号,而非命令选项或者路径名 不要对整数使用引号 特别注意 [[ 中模式匹配的引号规则 在无特殊情况下...这是因为在管道之后的while循环中,命令是在一个子shell中运行的,因此对变量的修改是不能传递给父shell的。 这种管道连接while循环中的隐式子shell使得bug定位非常困难。
image Shell运算符 算数运算符: 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr....image Shell中的字符串 单引号的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。..." " 获取字符串长度: string="abcd" echo ${#string} #输出 4 提取子字符串: string="alibaba is a great company" echo ${string...: 例如:当一个路径为 /home/xiaoming/1.txt时,如何怎么它的路径(不带文件) 和如何得到它的文件名??...commandN done 复制代码 注意:列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
注意:这个 $0 环境变量如果用在子shell中(shell脚本文件)输出Shell脚本本身的文件名。...,说明全局变量在当前Shell环境与子Shell环境中可用,父Shell环境中不可用。...: 格式 说明 示例 ${变量名/旧字符串/新字符串} 将旧字符串替换成新字符串,仅替换第一个 ${path/sbin/SBIN}将sbin替换成SBIN,仅替换第一个 ${变量名//旧字符串/新字符串...} 将旧字符串替换成新字符串,替换所有 ${path//sbin/SBIN}将sbin替换成SBIN,所有的都替换 变量的测试及默认值: 变量设定方式 str没有设定 str为空字符串 str已设定非为空字符串...,由于上面只赋值了3个元素, 所以数组的长度是3arr[6]=100 #Shell数组元素定义后不是固定的, 定义后还可以赋值 获取: 1234 ${arr[1]} #通过下标获取${arr[@
来替换%%进行操作 字符串替换的语法:%var:str1=str2%,将字符串var中所有的str替换为str2 所以上面的=!relativePath:%src_dir%=!...Run 方法启动在新 Windows 进程中运行的程序。可以让脚本等到程序执行完后再继续执行。这允许您同步运行脚本和程序。strCommand 参数内的环境变量自动扩展。...在调用bat的时候可以传递参数,上面的param1、param2就是传入的参数,在bat中通过%1、%2..%n进行获取。...通过WScript.Shell对象获取应用程序的执行目录,例如现在想获得WinRAR的应用程序目录: rarPath = wsh.RegRead("HKEY_CLASSES_ROOT\\WinRAR\\...shell\\open\\command\\").match(/"([^"]*)"/)[1]; 调用Run方法便可以调用它了 WinRAR常用的参数: a 添加文件到压缩文件 -r 包含子文件夹
shell做为一种和Linux系统的特殊交互式工具,为用户提供了启动程序、管理文件系统中的文件及运行在Linux上的进程的途径。shell通过解析输入的文本命令,在内核中执行来达到与系统交互的功能。...用户登入终端所启动的shell是一个父shell。在终端的提示符后输入bash命令或其他等效bash命令时会创建一个新的shell程序,这个shell被称为子shell。...下面我们也可以自己用C语言程序的运行来获取当前路径,利用shell实时维护环境变量PWD的特性来完成。.../mycmd也是一个字符串,所以argc代表的就是字符串的个数,argv指针数组中的指针,指向的就是这些字符串,通过程序运行结果和代码,可以证明这个结论,argv数组中打印出来的值实际上就是这些字符串,...2.子进程中三种获取环境变量的方式 2.1 通过系统调用获取环境变量(获取指定的环境变量内容) 1.
0、什么是 shell shell 通常是一个命令行界面,它将操作系统的服务暴露给人类使用或其他程序。在 shell 启动后,shell 通常会通过显示提示来等待用户的输入。...下图描述了基本的 UNIX 和 Windows shell 提示。 所以 shell 会提示用户输入命令。现在是用户输入命令的时候了。那么 shell 是如何获取用户输入的命令并进行解释的呢?...shell 回去环境变量 PATH 中去查找,PATH 这个环境变量就是存储可执行命令的位置的。 不过,一个 PATH 存储的路径可不止一个: 如何在这么多路径中高效的查找到 ls 命令呢?...(fork 声明在#include 中) pid_t fork(void); fork() 通过复制调用进程来创建一个新进程。新进程称为子进程。调用进程称为父进程。...pid_t wait(int *wstatus); wstatus:是一个指向整数的指针,可以用来标识子进程是如何终止的。 shell 在子进程内执行命令,然后 wait() 等待子进程完成。
因此,虽然我们常说是“程序替换”,但实际上更准确地说是将新程序加载到内存中,替换掉原有的程序,以实现进程的功能切换和更新。 程序运行要加载到内存;为什么?冯诺依曼体系规定;如何加载的呢?...把数据从一个硬件搬到另一个硬件,只有操作系统能做 2.多进程时的程序替换 我们可以创建一个子进程,由子进程来进行程序替换,父进程来等待结果就可以。为什么?...进程具有独立性,在进行程序替换时要进行写时拷贝 写时拷贝的本质就是开辟新的空间 shell是如何运行起来一个指令的?...首先创建子进程,shell会waitpid()等待进程结果,子进程会继承shell的代码,但是不影响。...这个函数用于将字符串添加到环境变量中,或者修改已经存在的环境变量的值。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性 单凭这段文字,大家肯定还不能理解到底什么是环境变量,那下面我们通过几个问题来帮助大家理解 2. 如何理解呢?...通过代码如何获取环境变量 上面我们提到,系统启动的时候,就已经存在大量的环境变量,那如果我们想获取到这些环境变量要怎么做呢?...5.2 通过全局变量environ获取 那么除了上面的方法,我们还可以通过一个全局变量来获取环境变量: 这个全局变量叫做——environ 我们可以来查看一下 我们看到,它的类型是char*...通过系统调用获取环境变量 上面呢我们已经介绍了两种通过代码获取环境变量的方式,但是: 我们以后如果要获取某个环境变量比如PATH的时候,难道要像上面那样遍历指针数组(环境变量表),再通过字符串匹配去一个个找吗...比如: 另外我们发现这样的话这个hello1也可以像环境变量那样打印 那它也可以通过子进程获取到嘛,我们来试一下: 现在我们用getenv来获取hello1 我们来运行一下 我们发现啥也没有
领取专属 10元无门槛券
手把手带您无忧上云