博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux脚本中有source相关命令时的注意事项
阅读量:5247 次
发布时间:2019-06-14

本文共 1044 字,大约阅读时间需要 3 分钟。

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

[root@localhost u01]# more 1.sh #!/bin/bashgrep -q "export JAVA_HOME" /etc/profile  if [ $? -ne 0 ]; then  echo -e 'export JAVA_HOME=/u01/jdk'>>/etc/profileecho -e 'export PATH=$JAVA_HOME/bin:$PATH'>>/etc/profileecho -e 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'>>/etc/profilefiecho "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里面。

转载于:https://www.cnblogs.com/hsia2017/p/8406232.html

你可能感兴趣的文章
WinDbg调试C#技巧,解决CPU过高、死锁、内存爆满
查看>>
linux脚本中有source相关命令时的注意事项
查看>>
css样式表中的样式覆盖顺序
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
REST Web 服务(二)----JAX-RS 介绍
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
LANDR:在线母带处理
查看>>
java web项目修改favicon.ico图标的方式
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
perl 学习笔记
查看>>