./test.sh 和 . test.sh的区别,案例分析

1. . test.sh

test.sh

bash 复制代码
#!/bin/bash

declare -A myMap
myMap["key1"]="value1"
myMap["key2"]="value2"
myMap["key3"]="value3"


for key in "${!myMap[@]}"; do
    echo "Key: $key, Value: ${myMap[$key]}"
done  

执行 . test.sh输出如下:

bash 复制代码
root@hg-pc:/home/hg/Desktop# . test.sh 
Key: key2, Value: value2
Key: key3, Value: value3
Key: key1, Value: value1

此时,修改test.sh,将赋值操作全部去掉,同样执行 . test.sh

bash 复制代码
```bash
#!/bin/bash

declare -A myMap

for key in "${!myMap[@]}"; do
    echo "Key: $key, Value: ${myMap[$key]}"
done  

输出如下:

bash 复制代码
root@hg-pc:/home/hg/Desktop# . test.sh 
Key: key2, Value: value2
Key: key3, Value: value3
Key: key1, Value: value1

myMap明明是个空的,为什么还能打印出数据???
使用点号(.)和空格来执行一个脚本,后面跟着脚本的文件名。这种方式在Shell中被称为"点命令"(Dot command)或"source"命令。它的作用是在当前Shell环境中执行指定的脚本。也可以使用source test.sh来实现相同的效果。使用. test.sh执行脚本时,脚本文件会在当前Shell环境中执行,不会创建新的子进程。脚本文件中的环境变量和函数会影响到当前Shell的环境。这种执行方式通常用于加载配置文件或在当前Shell中定义函数和变量。

也可以这么理解,第一次执行赋值后,哪怕第二次把赋值操作给去了,它也能打印出数据,因为隶属于同一个终端,,,
此时开启一个新的终端,再次执行 . test.sh,可以看出,,没有任何输出。。。

bash 复制代码
root@hg-pc:/home/hg/Desktop# . test.sh 
root@hg-pc:/home/hg/Desktop# 

2. . /test.sh

bash 复制代码
#!/bin/bash

num=23
echo "### ${num}"
bash 复制代码
root@hg-pc:/home/hg/Desktop# . test.sh
### 23

第一次执行后, 这个num在当前终端中始终存在。


bash 复制代码
#!/bin/bash

echo "### ${num}"
bash 复制代码
root@hg-pc:/home/hg/Desktop# . test.sh 
### 23

所以即使此处直接输出num,也还能打印出值。


下面来看 ./test.sh

开启一个新终端,命名为2号终端。

bash 复制代码
#!/bin/bash

num=23
echo "### ${num}"
bash 复制代码
root@hg-pc:/home/hg/Desktop# ./test.sh 
### 23

仍然在2号终端中执行。

bash 复制代码
#!/bin/bash

echo "### ${num}"
bash 复制代码
root@hg-pc:/home/hg/Desktop# ./test.sh 
### 

使用./test.sh执行脚本时,Shell会创建一个子进程来执行脚本文件。脚本文件中的环境变量和函数在子进程中生效,但不会影响到当前Shell的环境

总结:./test.sh是在子进程中执行脚本文件,而 test.sh是在当前Shell环境中执行脚本文件。

相关推荐
茶本无香8 小时前
Java调用Shell脚本执行SQL数据库操作:从入门到实战
java·sql·shell
柒号华仔2 天前
「速通Shell」织线为面,Shell条件测试和判断
shell
苏灿烤鱼4 天前
把 Agent 做成一家公司,真比通用提示词好用吗?
python·agent·shell
寺中人4 天前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
k4m7v2pz8 天前
34 天 33 个版本:rvs(rust-verb-shell)如何用版本号对抗 AI 误判
rust·shell·命令行工具·ai agent·系统信息·跨平台开发
笨笨狗吞噬者8 天前
IRIS: shell 中的智能实时输入提示工具
github·shell
Lyra_Infra10 天前
Java 应用启动脚本 JDK 路径适配优化文档
java·shell
寒水馨12 天前
macOS下载、安装PowerShell-v7.6.4(附安装包powershell-7.6.4-osx-arm64.pkg)
macos·自动化·跨平台·shell·脚本·命令行·powershell
爱码少年13 天前
一条Shell命令实现文件目录服务器间快速转移
服务器·shell
重生的黑客15 天前
Linux 进程程序替换与自定义 Shell:从 exec 函数族到命令行解释器
linux·运维·服务器·shell