0


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

1.

. test.sh

test.sh

#!/bin/bashdeclare -A myMap
myMap["key1"]="value1"
myMap["key2"]="value2"
myMap["key3"]="value3"forkeyin"${!myMap[@]}";doecho"Key: $key, Value: ${myMap[$key]}"done

**执行

. test.sh

输出如下:**

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
#!/bin/bashdeclare -A myMap

forkeyin"${!myMap[@]}";doecho"Key: $key, Value: ${myMap[$key]}"done

输出如下:

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,可以看出,,没有任何输出。。。

root@hg-pc:/home/hg/Desktop# . test.sh 
root@hg-pc:/home/hg/Desktop# 

2.

. /test.sh
#!/bin/bashnum=23echo"### ${num}"
root@hg-pc:/home/hg/Desktop# . test.sh### 23

**

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

**


#!/bin/bashecho"### ${num}"
root@hg-pc:/home/hg/Desktop# . test.sh ### 23

**

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

**


**

下面来看 ./test.sh

**

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

#!/bin/bashnum=23echo"### ${num}"
root@hg-pc:/home/hg/Desktop# ./test.sh ### 23

仍然在2号终端中执行。

#!/bin/bashecho"### ${num}"
root@hg-pc:/home/hg/Desktop# ./test.sh ### 

**使用

./test.sh

执行脚本时,Shell会创建一个子进程来执行脚本文件。

脚本文件中的环境变量和函数在子进程中生效,但不会影响到当前Shell的环境

。**

总结:

./test.sh

是在子进程中执行脚本文件,而

 test.sh

是在当前Shell环境中执行脚本文件。

标签: shell

本文转载自: https://blog.csdn.net/TianYanRen111/article/details/131480134
版权归原作者 @十三阿哥 所有, 如有侵权,请联系我们删除。

“./test.sh 和 . test.sh的区别,案例分析”的评论:

还没有评论