source和.命令的区别

source FileName

  作用:在当前bash环境下读取并执行FileName中的命令。

  注:该命令通常用命令“.”来替代。

  如:source .bash_rc 与 . .bash_rc 是等效的。

  source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是个点符号,(从Bourne Shell而来)是source的另一名称。同样的,当前脚本中配置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文档,如 .bash_profile 和 .profile 等等。例如,假如在登录后对 .bash_profile 中的 EDITER 和 TERM 变量做了修改,则能够用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。

  比如您在一个脚本里export $KKK=111 ,假如您用./a.sh执行该脚本,执行完毕后,您运行 echo $KKK ,发现没有值,假如您用source来执行 ,然后再echo ,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是 source不同他就是在本shell中执行的,所以能够看到结果

  source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将 作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。同样的,当前脚本中设置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。例如,如果在登录后对 .bash_profile 中的 EDITER 和 TERM 变量做了修改,则可以用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。象 .bash_profile 或其它类似的Shell脚本这样,文件无需可执行权限即可用source或点命令执行。

  source命令的一个妙用

  在编译核心时,常常要反复输入一长串命令,如

  make mrproper

  make menuconfig

  make dep

  make clean

  make bzImage

  .......

  这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用户来说,会很方便。用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。先在/usr/src/linux- 2.4.20目录下建立一个文件,取名为make_command:

  在其中输入如下内容:

  make mrproper &&

  make menuconfig &&

  make dep &&

  make clean &&

  make bzImage &&

  make modules &&

  make modules_install &&

  cp arch/i386/boot/bzImge /boot/vmlinuz_new &&

  cp System.map /boot &&

  vi /etc/lilo.conf &&

  lilo -v

  文件建立好之后,以后每次编译核心,只需要在/usr/src/linux-2.4.20下输入

  source make_command

  就行了。这个文件也完全可以做成脚本,只需稍加改动即可。这里主要是让大家理解source的用法。如果你用的不是lilo来引导系统,可以把最后两句话去掉。配置你自己的引导程序来引导新内核。

  shell编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如 make mrproper && make menuconfig ,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。

  ---------------- 我的测试 ----------------------

  1 建立test.sh

  #!/bin/bash

  export s=/home/jboss/

  2 执行命令: source test.sh

  echo $s

  结果输出: /home/jboss/

  3 新开个shell

  执行命令: ./test.sh

  echo $s

  结果: 没有输出s值

 

 

source filename 与 sh filename 及./filename执行脚本的区别在那里呢?
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

转载于:https://www.cnblogs.com/mingziday/p/3262336.html

<think>我们正在讨论的是Linux/Unix系统中的`source admin.src`命令。 根据用户的问题,我们需要解释这个命令的含义使用场景。 首先,`source`是一个shell内建命令(built-in command),它的作用是在当前shell环境中执行指定的脚本文件,而不是在子shell中执行。这意味着脚本中设置的变量、函数等在脚本执行完毕后仍然存在于当前shell中。 语法通常为:`source filename [arguments]` 或者等价的使用点号:`. filename [arguments]`。 因此,`source admin.src`的含义是:在当前shell环境中执行名为`admin.src`的脚本文件。 使用场景: 1. 设置环境变量:当有一个脚本(如admin.src)中定义了一些环境变量,我们希望通过执行这个脚本将这些变量设置到当前shell中,而不是在子shell中执行(因为子shell中的变量不会影响父shell)。例如,在开发环境中设置项目特定的环境变量。 2. 定义函数:如果脚本中定义了一些函数,我们希望这些函数在当前shell中可用,那么使用source命令执行脚本。 3. 修改当前shell的状态:比如改变当前工作目录(因为如果在子shell中执行脚本,改变目录只影响子shell,而source则会影响当前shell)。 注意:`admin.src`这个文件名可能是任意指定的,通常这种文件的内容是一系列shell命令,用来设置环境。例如,它可能包含如下内容: export JAVA_HOME=/path/to/java export PATH=$JAVA_HOME/bin:$PATH alias admin_tool='/path/to/tool' 当我们执行`source admin.src`后,这些变量别名就会在当前shell中生效。 与直接执行脚本(例如`./admin.src`)的区别: 直接执行脚本需要该文件具有可执行权限,并且会在子shell中运行,因此脚本中设置的变量在脚本执行结束后就消失了,不会影响当前shell。 示例: 假设admin.src内容如下: #!/bin/bash export MY_VAR="Hello World" alias ll='ls -l' 如果我们使用`source admin.src`,那么MY_VAR环境变量会被设置,并且别名ll也会被设置,在当前shell中我们可以使用它们。 而如果我们用`./admin.src`(假设有可执行权限),那么脚本执行后,MY_VARll都不会在当前shell中生效。 因此,`source`命令常用于加载配置文件,更新当前shell环境。 引用说明: 根据引用[2]:内建命令不会衍生子进程,而外部命令会。source是内建命令,因此它不会创建子shell,而是直接在当前shell执行。 所以,总结: `source admin.src`:在当前shell环境中执行admin.src脚本,使得脚本中设置的变量、别名等在当前shell中立即生效。 相关问题: 1. 如果admin.src脚本中包含了改变当前工作目录的命令(如cd),那么执行source admin.src后当前shell的目录会改变吗? 2. 如何判断一个命令是内建命令还是外部命令? 3. 在脚本中,如何检测当前脚本是被source执行还是被直接执行的? 4. 使用source执行脚本直接执行脚本在资源使用上有什么不同?</think>### source admin.src 命令详解 #### 一、命令含义 `source admin.src` 是 Linux/Unix 系统中的 Shell 内建命令,核心作用是在**当前 Shell 会话中直接执行指定脚本**(此处为 `admin.src`)。其等效写法是 `. admin.src`(注意点号后的空格)。关键特性: - 📌 **不创建子进程**:直接在当前 Shell 环境中执行(区别于 `./admin.sh` 会创建子进程) - 🔁 **环境继承**:脚本中设置的变量、函数、别名等会**永久保留**在当前 Shell - ⚙️ **即时生效**:无需重启终端或重新登录 #### 二、典型使用场景 1. **环境变量配置** 当 `admin.src` 包含环境变量设置(如 `export PATH=/new/path:$PATH`)时,`source` 使其立即生效: ```bash # admin.src 内容示例 export JAVA_HOME=/opt/jdk export PATH=$JAVA_HOME/bin:$PATH ``` → 执行后当前 Shell 即可使用新 `PATH` 2. **函数/别名加载** 脚本中定义的函数或别名直接融入当前 Shell: ```bash # admin.src 内容示例 alias mylog="tail -f /var/log/syslog" function sysinfo() { echo "CPU: $(lscpu | grep 'Model name')" } ``` 3. **开发环境初始化** 项目初始化脚本(如设置 Python 虚拟环境): ```bash # admin.src 内容示例 source venv/bin/activate # 激活虚拟环境 export FLASK_APP=app.py ``` 4. **安全敏感操作** 需直接修改当前 Shell 状态的操作(如 `cd` 切换目录): ```bash # admin.src 内容示例 cd /critical/project/dir # 直接改变当前工作目录 ``` #### 三、与直接执行脚本的区别 | 执行方式 | 进程模型 | 环境影响范围 | 典型用例 | |-------------------|---------------|----------------|------------------| | `source admin.src` | 当前 Shell 进程 | **永久生效** | 环境变量/函数加载 | | `./admin.src` | 创建子进程 | 仅子进程内有效 | 独立任务执行 | > 💡 原理:内建命令Shell 自身处理,不衍生子进程[^2],因此能直接修改当前环境。 #### 四、注意事项 1. **脚本内容信任** 由于直接影响当前 Shell,需确保 `admin.src` 来源可信(恶意脚本可能破坏环境) 2. **文件路径** 若 `admin.src` 不在当前目录,需使用绝对路径(如 `source /opt/configs/admin.src`) 3. **错误处理** 脚本中的语法错误会直接终止当前 Shell 会话(建议用 `set -e` 提前验证) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值