./1.sh的行为等同于sh 1.sh或bash 1.sh,即:
✅会启动一个新的子进程来执行脚本,不共享父 Shell 的变量和函数(除非变量被
export)。
🔍 详细解释
前提条件:
- 文件
1.sh必须具有可执行权限(可通过chmod +x 1.sh设置); - 文件开头有正确的Shebang 行(如
#!/bin/bash或#!/bin/sh)。
执行机制:
当你运行:
./1.sh系统会:
- 根据
1.sh第一行的 Shebang(例如#!/bin/bash)决定用哪个解释器; - 启动一个新进程(如
/bin/bash ./1.sh)来执行该脚本; - 这个新进程是当前 Shell 的子进程,拥有独立的环境。
🔄 与其它方式对比
| 调用方式 | 是否新建进程 | 变量是否共享 | 函数是否共享 | 依赖 Shebang | 需要可执行权限 |
|---|---|---|---|---|---|
./1.sh | ✅ 是 | ❌ 否(仅export) | ❌ 否 | ✅ 是 | ✅ 是 |
sh 1.sh | ✅ 是 | ❌ 否(仅export) | ❌ 否 | ❌ 否(强制用 sh) | ❌ 否 |
bash 1.sh | ✅ 是 | ❌ 否(仅export) | ❌ 否 | ❌ 否(强制用 bash) | ❌ 否 |
source 1.sh | ❌ 否 | ✅ 是 | ✅ 是 | ❌ 否 | ❌ 否 |
. 1.sh | ❌ 否 | ✅ 是 | ✅ 是 | ❌ 否 | ❌ 否 |
💡 注意:
- 如果
1.sh没有 Shebang,./1.sh可能会失败或使用默认 shell(取决于系统);sh 1.sh会忽略 Shebang,强制用sh解释器。
✅ 示例说明
假设parent.sh内容如下:
#!/bin/bashname="Alice"./child.sh# 或 sh child.shecho"Parent:$name"child.sh内容:
#!/bin/bashecho"Child:$name"name="Bob"输出:
Child: # (空!因为 name 未 export) Parent: Alice # 父脚本变量未被修改但如果改成:
exportname="Alice"./child.sh则child.sh中能读到Alice,但修改name="Bob"仍不会影响父脚本。
⚠️ 常见误区
❌ “
./1.sh和source 1.sh差不多?”
✅ 完全不同!前者是“运行一个程序”,后者是“把代码粘贴到当前 shell 执行”。
✅ 总结
./1.sh≈bash 1.sh(如果 Shebang 是#!/bin/bash)- 它总是启动新进程,不共享非 export 变量,不影响父 Shell 状态。
- 是标准的、安全的脚本执行方式,适用于大多数场景(如启动服务、运行任务)。
📌 记住:
./xxx是“执行一个程序”,. xxx(带空格)是“加载一段代码”—— 名字相似,行为天壤之别!