zoukankan      html  css  js  c++  java
  • linux脚本中有source相关命令时的注意事项

    写这个问题起因是因为一个同学去的java一键脚本环境变量设置问题,

    [root@localhost u01]# more 1.sh 
    #!/bin/bash
    grep -q "export JAVA_HOME" /etc/profile  
    if [ $? -ne 0 ]; then  
    echo -e 'export JAVA_HOME=/u01/jdk'>>/etc/profile
    echo -e 'export PATH=$JAVA_HOME/bin:$PATH'>>/etc/profile
    echo -e 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'>>/e
    tc/profile
    fi
    echo "config java success"
    source /etc/profile

    这个脚本使用正常sh 1.sh和./1.sh执行的时候,java -version找不到命令,还需要再次执行命令#source /etc/profile或者打开新的shell进程方可。

    这是因为sh 1.sh或者./1.sh是在一个子进程中运行的, 任何分配的变量会在脚本运行结束时释放掉. 脚本中声明的变量脚本运行结束后也就不复存在;

    而如果使用source 1.sh就没有任何问题,因为source 1.sh在当前环境下执行, 所有的变量即使脚本运行结束也会被保留下来(无需显示的声明),也可以使用当前bash中定义的变量.

    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里面。
  • 相关阅读:
    jedisPool.returnBrokenResource 弃用
    错误,各种错误
    Spring加载resource时classpath*:与classpath:的区别
    Embedded database support
    IDEA 中 显示 *.properties 为中文
    Key promoter IDEA 快捷键 提示 插件
    Win7系统怎么删除今日热点【系统天地】
    win10深度清理c盘垃圾的方法【系统天地】
    win7系统如何清理注册表残留
    win10系统文件无法复制到u盘怎么办【系统天地】
  • 原文地址:https://www.cnblogs.com/hsia2017/p/8406232.html
Copyright © 2011-2022 走看看