Linux source命令详解与应用场景解析
说得好这是一个非常核心且常见的Linux/Unix命令。简单直接的回答是不source命令远不止是加载环境变量虽然这是它最常用的场景之一。它的核心功能是在当前Shell环境中读取并执行指定文件中的命令。让我们来深入分解一下核心原理打破子Shell的隔离要理解source 必须先理解当你普通地运行一个脚本时发生了什么普通执行脚本例如./my_script.sh或bash my_script.sh当前Shell你的终端窗口会启动一个新的子Shell进程。这个子Shell会去执行脚本文件里的所有命令。执行完毕后子Shell进程退出。在子Shell中对环境做的任何改变比如使用export设置的环境变量、改变的目录、定义的函数等都只存在于该子进程中。随着子进程的结束这些改变全部消失不会影响父Shell你的终端。使用source执行脚本例如source my_script.sh或. my_script.sh没有创建新的子Shell。当前Shell会直接打开这个文件并一行一行地执行其中的命令就像你亲手把这些命令敲到终端里一样。因此脚本中所有命令产生的效果环境变量、目录更改、函数定义等都会直接、永久地应用于当前Shell会话。source和.是完全等价的后者是前者的简写形式。source的主要用途不只是环境变量基于“在当前Shell中执行”这个核心source有以下几个典型应用场景1. 加载环境变量最常见的用法这确实是最主要的用途。当你修改了~/.bashrc、~/.bash_profile或~/.zshrc等配置文件后你不会想关闭终端再打开。使用source可以立即让更改生效。1234# 重新加载 bash 配置source~/.bashrc# 或者简写为. ~/.bashrc2. 加载Shell函数如果你在一个脚本文件中定义了一些有用的函数你希望在当前Shell会话中能直接使用它们而不是每次调用都跑一遍完整的脚本。文件my_functions.sh1234#!/bin/bashgreet() {echoHello, $1!}123456# 普通执行函数不会保留./my_functions.shgreetWorld# 报错command not found# 使用 source函数被加载到当前Shellsourcemy_functions.shgreetWorld# 输出Hello, World!3. 在脚本中加载外部库/配置一个复杂的项目可能会将配置变量、公共函数放在单独的文件中。主脚本可以通过source来引入这些文件。文件config.sh12DB_HOSTlocalhostDB_USERmyuser文件main_script.sh1234#!/bin/bash# 引入配置文件source./config.shechoConnecting to database at $DB_HOST with user $DB_USER...4. 修改当前Shell的状态有些命令需要改变当前Shell的工作目录或其他状态。文件go_to_project.sh12#!/bin/bashcd/path/to/my/very/long/project/directory123456# 普通执行cd 在子Shell中发生对你无效./go_to_project.shpwd# 你还是在你原来的目录# 使用 sourcecd 在当前Shell中生效sourcego_to_project.shpwd# 你已经在 /path/to/my/very/long/project/directory 了总结对比特性source script.sh或. script.sh./script.sh/bash script.sh执行环境当前Shell新的子Shell环境变量会影响当前Shell不会影响当前Shell目录更改会改变当前Shell的目录不会改变当前Shell的目录函数定义会在当前Shell中生效不会在当前Shell中生效脚本退出使用exit会关闭你的整个终端使用exit只会退出子Shell终端没事所以source是一个强大的工具它让你能够将外部脚本的代码“注入”到当前的Shell会话中运行。加载环境变量只是这个强大功能的一个具体应用。下次当你需要让一个脚本的改动直接作用于你的终端时记得使用source。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479495.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!