首页 > 系统相关 >linux里source、sh、bash、./有什么区别(转)

linux里source、sh、bash、./有什么区别(转)

时间:2024-07-10 22:02:35浏览次数:14  
标签:script process echo source sh linux bash

在linux里,source、sh、bash、./都可以执行shell script文件,那它们有什么不同吗?

1、source

source a.sh

在当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限"

source命令可以简写为"."

. a.sh

注意:中间是有空格的。

2、sh/bash

sh a.sh
bash a.sh

都是打开一个subshell去读取、执行a.sh,而a.sh不需要有"执行权限"

通常在subshell里运行的脚本里设置变量,不会影响到父shell的。

3、./

./a.sh
#bash: ./a.sh: 权限不够
chmod +x a.sh
./a.sh

打开一个subshell去读取、执行a.sh,但a.sh需要有"执行权限"

可以用chmod +x添加执行权限

另外,使用./来执行的文件里有alias语句的话,shell并不会把alias别名扩展成对应的命令,要解决的话,得使用shopt命令来开启alias扩展选项

shopt -s expand_aliases

4、fork、source、exec

使用fork方式运行script时, 就是让shell(parent process)产生一个child process去执行该script,当child process结束后,会返回parent process,但parent process的环境是不会因child process的改变而改变的。
使用source方式运行script时, 就是让script在当前process内执行, 而不是产生一个child process来执行。由于所有执行结果均于当前process内完成,若script的环境有所改变, 当然也会改变当前process环境了。
使用exec方式运行script时, 它和source一样,也是让script在当前process内执行,但是process内的原代码剩下部分将被终止。同样,process内的环境随script改变而改变。
通常如果我们执行时,都是默认为fork的。

为了实践下,我们可以先建立2个sh文件,以下代码来自ChinaUnix的網中人:

1.sh

#!/bin/bash
A=B
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: \$A is $A"
case $1 in
    exec)
        echo "using exec..."
        exec ./2.sh ;;
    source)
        echo "using source..."
        . ./2.sh ;;
    *)
        echo "using fork by default..."
        ./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: \$A is $A"

2.sh

#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"

自己运行下,观看结果吧

标签:script,process,echo,source,sh,linux,bash
From: https://www.cnblogs.com/fattree/p/18295071

相关文章

  • 实战篇——SSRF漏洞Redis反弹shell实战
    实战篇——SSRF漏洞Redis反弹shell实战SSRF之Redis实战上一章中利用file伪协议实现了内网的主机探测,发现存在192.168.118.151,对其进行端口探测:可见开放了6379端口,结合响应判断为Redis服务。而Redis存在未授权访问漏洞,可以利用该漏洞实现信息泄露、数据删除以及反弹shell,下面......
  • Linux awk命令中如何删除数组
     001、Linuxawk中如何删除数组(base)[b20223040323@admin2test]$cut-f5-6rt288_2_3.bim|paste-<(cut-f5-6yt4_2_3.bim)|headCA0ATCCTCACAACCATG......
  • GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
    文章目录题目摘要引言方法实验消融题目Gollie:注释指南改进零样本信息提取论文地址:https://arxiv.org/abs/2310.03668摘要    大型语言模型(LLM)与指令调优相结合,在泛化到未见过的任务时取得了重大进展。然而,它们在信息提取(IE)方面不太成功,落后于特定任......
  • (4-3)Floyd-Warshall算法:Floyd-Warshall算法的应用案例
    4.3 Floyd-Warshall算法的应用案例Floyd-Warshall算法在许多实际应用中都有着广泛的应用,特别是在需要计算图中所有顶点对之间的最短路径时,它是一种非常有效的解决方案。4.3.1  自驾线路规划暑假来临,家庭A决定自驾旅行,计划去四个城市:A、B、C、D,每个城市之间的行车距离如......
  • HashMap和ConcurrentHashMap的底层实现原理
    (1)HashMap底层实现原理在JDK1.7版本之前,HashMap数据结构是数组和链表,HashMap通过哈希算法将元素的键(Key)映射到数组中的槽位(Bucket)。如果多个键映射到同一个槽位,它们会以链表的形式存储在同一个槽位上,因为链表的查询时间是O(n),所以冲突很严重,一个索引上的链表非常长,......
  • Linux基础
    一.Linux系统组成Linux系统是一个多层次的结构,包含了:内核、系统库、Shell以及应用程序等1.内核内核:是Linux系统的核心,也是Linux系统的基础,负责管理系统的硬件和提供最基本的系统服务。包含了:设备驱动程序、进程管理、内存管理、文件系统、网络协议栈等关键的底层功能和组......
  • Linux-shell编程入门基础
    目录前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量$特殊符号(很重要)其他内置shell命令shell语法的子串截取统计指令执行时间练习shell特殊扩展变量父子shell的理解内置和外置命令区别数值计算双括号(())运算letexprexpr模式匹配bcawk中括号shell的条件判......
  • Shell实战之SSH+Shell脚本实现远程控制多主机
    问题引入我在学习Hadoop,Spark等框架时,发现配置伪分布式环境时经常需要同时控制多台主机,Moba自带的MultiExec并不适合同时控制4台以上的主机。因此我自己设计了一段简单的shell脚本实现了这一功能。准备在使用这个脚本之前需要预先实现集群间的IP地址映射vim/etc/hosts按......
  • Linux C语言基础 day8
    目录思维导图:学习目标:学习内容:1.字符数组1.1二维字符数组1.1.1格式1.1.2初始化1.1.3 二维字符数组输入输出、求最值、排序2.函数2.1概念关于函数的相关概念2.2函数的定义及调用2.2.1定义函数的格式2.3 函数的分类1.无参无返回值函数2、有参无返回......
  • 几何着色器 Geometry Shader
    参考: 【UnityShader入门】4、几何着色器GeometryShaders之结构解析_shader编译目标级别-CSDN博客GeometryShader(Unity几何着色器)_unitygeometryshader-CSDN博客Unity几何着色器详解-知乎(zhihu.com) /*[maxvertexcount(N)]:用来指定几何着色器单次调用所输出......