zoukankan      html  css  js  c++  java
  • Linux 执行脚本时 source 和 . 和 sh 和 ./ 的区别

    一般Linux上执行一个shell脚本,有如下几种方法:

    source test.sh
    . test.sh
    bash test.sh
    ./test.sh

    source 和 .

    source和 . 这两个都是shell自带的内建命令,这两个命令是等价的关系。也就是说这两条命令的执行是完全一样的。使用 type source 和 type . 可以看出它们都是内建命令;使用 help source 和 help . 也可以看出这两个命令的作用一模一样。因此,这两个命令是等价的,用哪个都行。

    作用:在当前 shell 中执行一个文件中的命令。即不会启动一个新的子 shell 进程。所有在脚本中设置的变量将成为当前Shell的一部分。

    sh filename 或 bash filename

    sh filename 另起一个子 shell 进程,在子 shell 中执行脚本里面的语句,该子 shell 继承父 shell 的环境变量(但不会继承普通变量,也就是没有被 export 的变量)。

    测试 source 和 . 和 sh 

    test.sh :

    #!/bin/bash
    
    echo "Print Bash Path:$SHELL"
    echo $EXPORT_VAR
    echo $LOCAL_VAR

    执行如下:

    可以看出,. 和 source 执行结果都是一样的,并且可以打印出当前 shell 中的变量 LOCAL_VAR,而使用 bash test.sh 则不能打印出 LOCAL_VAR,因为 bash test.sh 是另起了一个子 shell 执行的脚本,所以父 shell 中的普通变量不能继承,但是 export 的全局的环境变量是可以继承的。

    ./filename

    ./ 是用来执行一切可执行文件的方法,不仅仅可以用来执行shell脚本。需要特别注意的是 ./ 并不等于 . 符号,两者是具有本质区别的。使用 ./ 执行的文件必须是可执行文件,文件必须有 x 权限。
    ./  这个符号后面需要跟一个可执行文件的路径,用于定位执行文件的位置,这个路径可以是相对路径。那么如何区分不同的可执行文件呢?对于shell脚本来说,我们会在开头加上:#!/bin/bash

     

     使用 ./ 测试 test.sh,先给 test.sh 可执行的权限,从结果中可以发现,没有打印出普通变量 LOCAL_VAR,说明 ./ 也会另起一个 shell 进行可执行文件的执行。

    参考文章

    Linux shell执行source和 . 的区别_程序猿Ricky的日常干货-CSDN博客_linux shell source

    Linux下source命令详解_在努力!-CSDN博客_linux source

  • 相关阅读:
    VUE网页loading加载状态
    VUE使用canvas画板实现签字
    一个完整的项目管理流程
    APP原型的设计步骤是什么?
    如何对接网建SMS短信通短信验证码接口
    如何彻底红蜘蛛,非常方便!!!
    如何在cmd中连接数据库
    mvn deploy:deploy-file命令
    Java线程池的分析和使用
    jstat命令详解
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/15323028.html
Copyright © 2011-2022 走看看