• 【linux基础】— linux下的source filename.sh及与sh filename.sh、./filename.sh命令的区别



    一、source命令

    语法:

    source filename.sh
    . filename.sh

    两种写法的功能一样。

    功能:

    1、刷新当前的shell环境
    2、当前环境下执行shell脚本
    3、从脚本中导入shell函数到当前环境。
    4、从另一个脚本中读取变量

    举例1:刷新当前的shell环境。永久添加环境变量(影响当前用户),可以参考 linux 本地变量、环境变量与全局变量解析,修改后,要使用source filename,修改才会生效。

    [wqf@b1i10 ~]$ vim ~/.bashrc #打开并修改文件内容
    
    #在文件最后写入以下内容
    export PATH="/apps/wqf/model/bin/black_table:$PATH"
    
    [wqf@b1i10 ~]$ source /etc/profile #修改后,要使用source filename,修改才会生效。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    举例2:当前环境下执行shell脚本。使用source在当前shell会话中执行它。

    [wqf@b1i10 ~]$ vim test.sh
    
    ###在文件写入以下内容
    
    #!/bin/bash
    a=111
    echo $a 
    
    [wqf@b1i10 ~]$ source test.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    举例3:从脚本中导入shell函数到当前环境。

    [wqf@b1i10 ~]$ vim test_func.sh
    
    ###在文件写入以下内容
    
    #!/bin/bash
    vim test_func(){
    echo "hello"
    }
    
    [wqf@b1i10 ~]$ source test_func.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    举例4:从另一个脚本中读取变量。

    [wqf@b1i10 ~]$ vim test.sh  ##创建test.sh
    ###在文件写入以下内容
    
    #!/bin/bash
    a=11
    b=22
    c=33
    
    [wqf@b1i10 ~]$ vim read_test.sh ##创建read_test.sh
    ###在文件写入以下内容
    
    #!/bin/bash
    source ~./test.sh
    echo $a,$b,$c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    二、sh filename.sh与./filename.sh

    语法:

    sh filename.sh
    ./filename.sh

    功能:

    两者都是打开一个subshell去读取,执行filename.sh,通过在subshell里运行的脚本里设置变量,不会影响到父级shell的。而sh filename.sh不需要有执行权限,./filename.sh需要执行权限

    举例:

    [wqf@b1i10 ~]$ vim test.sh
    ###在文件写入以下内容
    
    #!/bin/bash
    a=111
    echo $a
    
    ##使用 sh filename.sh
    [wqf@b1i10 ~]$ sh test.sh
    111
    
    ##使用 ./filename.sh
    [wqf@b1i10 ~]$ ./test.sh
    -bash: ./test.sh: Permission denied
    ##用chmod +x添加执行权限
    [wqf@b1i10 ~]$ chmod +x test.sh
    [wqf@b1i10 ~]$ ./test.sh
    111
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    总结:

    当shell脚本有执行权限时,用sh filename.sh与./filename.sh执行脚本是没有区别的,因为当前目录没有在PATH中,所有“.”是用来表示当前目录的。

    三、source filename.sh与sh filename.sh及./filename.sh的区别

    1、sh filename.sh与./filename.sh重建一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。

    2、source filename.sh都是在当前shell里面执行脚本里面的语句,没有建立新的子shell,所以脚本里面所有新建的、改变的变量都会保存在当前shell里面。

    举例:

    [wqf@b1i10 ~]$ vim test.sh
    ###在文件写入以下内容
    
    #!/bin/bash
    a=111
    
    [wqf@b1i10 ~]$ chmod +x test.sh
    
    [wqf@b1i10 ~]$ ./test.sh
    [wqf@b1i10 ~]$ sh test.sh
    [wqf@b1i10 ~]$ echo $a  #显示为空,因为a=111并未传回给当前shell
    
    [wqf@b1i10 ~]$ source test.sh
    [wqf@b1i10 ~]$ echo $a 会显示1,说明a=111的变量在当前shell中
    111
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    ubuntu20.04下安装nc
    Spring Boot从新秀到超巨,这份实战文档为你指明方向
    武汉星起航:跨境电商行业坑点在哪里?该如何避过
    一次 Keepalived 高可用的事故,让我重学了一遍它!
    2.13-CSS基础--清除浮动五种方法
    求00000000000000000
    Zlog日志框架学习笔记
    二、RTMP协议 入门
    Vue 2.0中引入的类型检查Flow
    IT运维:使用数据分析平台监控H3C交换机
  • 原文地址:https://blog.csdn.net/sodaloveer/article/details/133177271