./main.sh vs source main.sh 讲透

news/2026/1/21 15:52:38/文章来源:https://www.cnblogs.com/ofnoname/p/19503516

在终端里跑脚本的可能写法:

  • ./main.sh
  • source main.sh(或 . main.sh
  • bash main.sh / sh main.sh
  • 甚至 exec ./main.shnohup ./main.sh &

它们看起来都“能跑”,但性质上有差异。讲清楚避免经典踩坑。

差异的核心只有三点:

  1. 在哪个进程里执行?(当前 shell 还是子 shell)
  2. 会不会影响当前环境?(cd / export / 函数 / alias 等是否保留)
  3. 用哪个解释器?(shebang 决定还是你当前 shell 决定)

1. ./main.sh:把脚本当“程序”执行

./main.sh 会启动一个新的进程来运行脚本(可以理解为子 shell / 子进程)。

特性

  • 需要可执行权限:通常要 chmod +x main.sh
  • 解释器由 shebang 决定:脚本第一行例如:#!/usr/bin/env bash
  • 不会影响当前终端环境:脚本里 cd、变量赋值、export、函数定义……对你的当前 shell 都不会生效
  • echo $? 看到的是脚本退出码

适用场景

  • 构建/部署/批处理
  • 只想跑一次任务,不希望“污染”当前终端

2. source main.sh / . main.sh:把脚本“引入”当前 shell

source(或点号 .)不是启动新进程,而是把文件内容当作命令,在当前 shell 进程里逐行执行

特性

  • 不需要可执行权限(只要可读即可)
  • 会影响当前终端环境:脚本里做的 cd、变量、export、函数、alias、set -oulimit 等都会留下来
  • 脚本里的 exit 会直接把你的终端退出。因为脚本就是在当前 shell 里跑的,被 source 的脚本要提前结束,应该用 return(或把逻辑写到函数里)
  • 解释器不是 shebang 决定的:而是你的当前 shell(bash/zsh 等)。当然这个脚本的语法必须兼容你当前 shell

适用场景

  • 加载环境变量(如 venv/bin/activateconda
  • 设置 PATH / 代理 / 函数工具库
  • 需要让脚本的改动“留在当前终端”里

经典案例

假设脚本 main.sh 内容如下:

cd /tmp
FOO=bar
export BAR=baz

./main.sh 运行

./main.sh
pwd         # 仍然是原目录
echo "$FOO" # 空
echo "$BAR" # 空(通常)

因为这些变更发生在子进程里,脚本结束后子进程消失,环境也就消失了。

source main.sh 运行

source main.sh
pwd         # 变成 /tmp
echo "$FOO" # bar
echo "$BAR" # baz

因为变更发生在当前 shell,自然“留下来了”。

其他类似命令

3. bash main.sh:强制用 Bash 执行(子进程)

特性

  • ./main.sh类似,在子进程里跑:对当前 shell 不生效。不过不需要可执行权限
  • 强制用 bash 解析(无视 shebang)

适用场景

  • 脚本使用 bash 特性(数组、[[ ]]set -o pipefail
  • 你不想改权限或不想依赖 shebang

4. main.sh:错误写法

你可能想要./main.sh,但直接写main.sh不对,这是因为大多数系统默认 当前目录不在 PATH(安全原因)。

  • 当你在 Shell 中直接输入一个命令时,如果命令中包含斜杠,Shell 会将其视为路径,直接访问该位置的文件。

  • 无斜杠则触发 PATH 查找:如果命令是单纯的 main.sh,Shell 会将其理解为命令名,并在 PATH 环境变量所列出的目录中按顺序查找。出于安全考虑,绝大多数系统默认不将当前目录(.)加入 PATH

为什么作为参数时又不需要 ./ 了?

main.sh 不是命令行的第一个“单词”时,它的解析者不再是当前的 Shell,而是前面的命令。

  • bash main.sh:这里 bash 本身是一个命令,Shell 通过 PATH 找到了 /bin/bash 并启动它。main.sh 是作为参数传递给 bash 解释器的。bash 在处理这个参数时,会将其直接当作文件路径来寻找,而文件路径的查找默认始于当前目录source main.sh. main.sh同理

5. exec ./main.sh:用脚本替换当前 shell 进程

exec 会让脚本进程替换当前 shell 进程,而不是新开子进程。

  • 不会“回来”到原来的 shell(因为它被替换了)
  • 常用于:容器 entrypoint、进程接管、长驻前台任务

6. ( ... ):括号创建子 shell,隔离副作用

括号会创建一个子 shell,里面的 cd、变量等不会影响外部。

( source main.sh )
# main.sh 里的 cd/export 不会污染当前 shell
需求 推荐写法
只想跑脚本,不影响当前终端 ./main.shbash main.sh
脚本要修改当前终端环境(export / cd / 函数) source main.sh / . main.sh
脚本依赖 bash 特性,且不想 chmod bash main.sh
追求 POSIX 可移植 sh main.sh(确保脚本兼容)
想执行但不污染当前 shell ( ./main.sh )( source main.sh )
要用脚本接管当前进程 exec ./main.sh
要后台运行 / 断开终端仍运行 nohup ./main.sh & / setsid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维系列【仅供参考】:Ubuntu16.04升级到18.04--检查更新时出现问题--解决方法

Ubuntu16.04升级到18.04--检查更新时出现问题--解决方法 Ubuntu16.04升级到18.04--检查更新时出现问题--解决方法 解决办法 Ubuntu16.04升级到18.04–检查更新时出现问题–解决方法 一开始装Ubuntu时装的是16.04,后来装cuda时,发现核是4.15的,需要升级到18.04,于是输入sud…

【消息队列】Kafka 核心概念深度解析

Kafka 核心概念深度解析 基于最新 2025 年 Kafka 生态,以下是关键机制的系统性梳理: 一、分区与副本(Partition & Replica) 核心概念 分区(Partition):Topic 的物理分片,是 K…

强烈安利专科生必用AI论文写作软件TOP9

强烈安利专科生必用AI论文写作软件TOP9 2026年专科生论文写作工具测评:为何要关注AI写作软件? 随着人工智能技术的不断发展,AI写作工具逐渐成为学术写作中不可或缺的辅助工具。对于专科生而言,撰写论文不仅是一项重要的学习任务&a…

BthpanContextHandler.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

springboot174基于Java的高校学生课程预约成绩统计系统的设计与实现

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 摘要 随着高校教育信息化建设的不断推进,传统的学生课程预约与成绩统计方式已无法满足高效、精准的管理需求。基…

深入Kali Linux:高级渗透测试技术详解:无线网络高级渗透测试、破解WPAWPA2加密

第一部分:无线网络高级渗透测试 破解WPA/WPA2加密 在无线网络渗透测试中,破解WPA/WPA2加密是一个常见的任务。Kali Linux提供了强大的工具,如Aircrack-ng,用于执行这项任务。 首先,确保你的无线网卡支持监听模式&am…

C_ISCII.DLL文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

MCP协议核心技术揭秘:打通大模型与动态数据源的最后1公里

第一章:MCP 协议如何解决大模型无法访问实时数据的问题 大语言模型在处理任务时通常依赖静态训练数据,难以获取和响应实时变化的信息。MCP(Model Communication Protocol)协议通过标准化接口与外部数据源对接,使模型具…

FSMN VAD异步处理机制:高并发请求应对策略

FSMN VAD异步处理机制:高并发请求应对策略 1. 引言:为什么需要异步处理? 语音活动检测(VAD)在实际应用中常常面临一个现实问题:用户不会一个接一个地提交请求。会议录音、电话质检、在线教育等场景下&…

Android和IOS 移动应用App图标生成与使用 Assets.car生成

在移动应用开发里,图标往往被低估。 不是因为它不重要,而是因为看起来很简单:一张图,导进去就完了。但真正做过 Android iOS 双端的人都知道,图标也是打包阶段容易卡住的地方之一。 尺寸不对、资源缺失、iOS 构建报错…

springboot175基于springboot商场停车场预约服务管理信息系统

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 摘要 该系统基于SpringBoot框架开发,旨在为商场停车场提供高效、智能的预约服务与管理功能。通过整合现代信息技…

麦橘超然服务无法启动?Python依赖冲突解决步骤详解

麦橘超然服务无法启动?Python依赖冲突解决步骤详解 1. 问题背景与项目简介 你是不是也遇到过这样的情况:刚部署完“麦橘超然”Flux图像生成控制台,满怀期待地运行python web_app.py,结果终端报错一堆模块找不到、版本不兼容&…

开发者必看:Qwen3-1.7B镜像开箱即用部署实战推荐

开发者必看:Qwen3-1.7B镜像开箱即用部署实战推荐 你是否还在为大模型本地部署的复杂环境配置而头疼?是否希望快速体验最新一代通义千问模型的实际能力?本文将带你零门槛上手 Qwen3-1.7B 镜像,通过 CSDN 提供的一键式 AI 镜像服务…

Z-Image-Turbo高性能部署:DiT架构下1024分辨率生成实测

Z-Image-Turbo高性能部署:DiT架构下1024分辨率生成实测 你有没有遇到过这样的情况:想用文生图模型生成一张高清大图,结果等了十几分钟,出来的还是一张模糊拼接的“马赛克”?或者好不容易跑通环境,却发现模…

bthserv.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

Z-Image-Turbo值得入手吗?消费级显卡实测性能完整报告

Z-Image-Turbo值得入手吗?消费级显卡实测性能完整报告 1. 开源文生图新星:Z-Image-Turbo到底强在哪? 你有没有遇到过这种情况:想用AI画一张高质量的图片,结果等了半分钟还没出图,显卡风扇狂转&#xff0c…

springboot176基于JSP的教师科研项目报名系统

目录具体实现截图教师科研项目报名系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 教师科研项目报名系统摘要 该系统基于SpringBoot 1.7.6框架开发,采用JSP(Java…

渗透测试常用反弹shell方法(如何渗透测试反弹shell)—Windows篇渗透测试!

文章目录 反弹shell介绍常用反弹方式NetCat(NC)反弹正向NC反向NC mshta.exe利用msf利用模块方法一(msfconsole) Cobaltstrike利用模块hta攻击源码 rundll32.exe利用msf利用模块方法一(msfconsole)方法二(msfvenom) Rundll32加载hta Regsvr32.exe利用msf利…

CosyVoice2-0.5B免费部署方案:无需高端GPU也能运行

CosyVoice2-0.5B免费部署方案:无需高端GPU也能运行 1. 零样本语音合成新选择:CosyVoice2-0.5B为何值得关注 你有没有想过,只需要3秒钟的录音,就能完美复刻一个人的声音?阿里开源的 CosyVoice2-0.5B 正是这样一个让人…

输电线路巡检缺陷数据集是支撑巡检AI算法(如缺陷检测、分类、定位)研发与验证的核心基础

输电线路巡检缺陷数据集构建方案 输电线路巡检缺陷数据集是支撑巡检AI算法(如缺陷检测、分类、定位)研发与验证的核心基础。该数据集需覆盖线路本体、附属设施、周边环境三大类缺陷,具备数据多样性、标注准确性、场景全覆盖的特点。以下是一…